代码之家  ›  专栏  ›  技术社区  ›  Georg Leber

将间隔设置为“到”字符

  •  5
  • Georg Leber  · 技术社区  · 16 年前

    遵循SQL命令

    select TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))) from table1
    

    生成格式为+000000000 00:03:01.954000的结果。

    是否可以在to-char函数中输入特殊格式以获取 格式结果:+00 00:00:00.000?

    6 回复  |  直到 7 年前
        1
  •  4
  •   Frank Schmitt    9 年前

    我意识到它一点也不聪明,也不是你要找的特殊格式字符串,但是这个答案确实有效,因为输出是固定长度的:

    SELECT    SUBSTR(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))), 1, 1)
           || SUBSTR(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))), 9, 2)
           || ' '
           || SUBSTR(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00'))), 12, 12)
      FROM table1;
    

    它也只是滚动小数秒而不是四舍五入,但我从你的例子中假设它们都是零。

    这是更大的尴尬,但我无法抗拒:

    SELECT SUBSTR(REPLACE(TO_CHAR(NVL(arg1 - arg2, TO_DSINTERVAL('0 00:00:00')))
                         , '0000000', '')
                 , 1, 16)
      FROM table1;
    
        2
  •  18
  •   Vincent Malgrat    11 年前

    如果希望降低精度,可以强制转换结果:

    SQL> SELECT TO_DSINTERVAL('10 10:00:00') t_interval FROM dual;
    
    T_INTERVAL
    -----------------------------------------------------------
    +000000010 10:00:00.000000000
    
    SQL> SELECT CAST(TO_DSINTERVAL('10 10:00:00')
      2                 AS INTERVAL DAY(2) TO SECOND(3)) t_interval
      3    FROM dual;
    
    T_INTERVAL
    -----------------------------------------------------------
    +10 10:00:00.000
    

    编辑以下操作注释:

    Oracle Documentation (11gr1) :

    间隔数据类型没有格式模型。因此,要调整它们的表示,必须组合字符函数,如提取和连接组件。

    似乎您必须手动使用提取来实现所需的输出:

    SQL> SELECT to_char(extract(DAY FROM t_interval), 'fmS99999') || ' ' ||
      2         to_char(extract(HOUR FROM t_interval), 'fm00') || ':' ||
      3         to_char(extract(MINUTE FROM t_interval), 'fm00') || ':' ||
      4         to_char(extract(SECOND FROM t_interval), 'fm00.000')
      5    FROM (SELECT TO_DSINTERVAL('10 01:02:55.895') t_interval FROM dual)
      6  ;
    
    TO_CHAR(EXTRACT(DAYFROMT_INTER
    ------------------------------
    +10 01:02:55.895
    


    这不是很优雅,但似乎是处理微秒精度的唯一方法。

        3
  •  8
  •   musefan    14 年前

    to char()似乎有固定的格式:(因此regexp_substr可能是一个选项,例如:

    SELECT regexp_substr (TO_DSINTERVAL ('10 10:00:00'), '\d{2} \d{2}:\d{2}:\d{2}\.\d{3}') t_interval FROM dual
    
        4
  •  2
  •   Jeremy Gosling    11 年前

    不过,在寻找如何设置间隔的格式时,我遇到了这个问题,所以我认为应该添加这个注释。

    Oracle documentation ,向间隔中添加时间戳将导致时间戳,因此,通过添加一个具有零时间元素的常量时间戳,您可以使用标准来\u char format elements 对于日期时间…

    SELECT TO_CHAR( TIMESTAMP'1969-12-31 00:00:00' + TO_DSINTERVAL('0 00:03:01.954321'),
      'HH24:MI:SS.FF3' ) FROM dual;
    

    然而 ,如果间隔可能大于一天,则存在问题。对于将产生0的天数,没有格式元素。”ddd“是一年中的某一天,因此在上面的示例中为365,如果间隔大于某一天,则为1或更多。不过,只要你的时间间隔不到24小时,就可以了。

    如果加上这是11克,所以很可能不适用于操作。

        5
  •  0
  •   Leon    10 年前

    可以使用正则表达式除去最后一部分(或任何部分) OracleRegexp_Replace就是这样做的。

    从表1中选择regexp_replace(to_char(nvl(arg1-arg2,to_dsinterval('0 00:00:00')),'.')

        6
  •  0
  •   Grigo Port    7 年前
    SELECT W.SHIFT_NUMB || ' c: ' ||
           TO_CHAR(TO_DATE('01.01.2012', 'dd.mm.yyyy') + W.TIMEFROM, 'HH24:MI') ||
           ' по: ' ||
           TO_CHAR(TO_DATE('01.01.2012', 'dd.mm.yyyy') + W.TIMETO, 'HH24:MI'),
           w.ID
      FROM AC_WORK_SHIFT W
     WHERE W.CLIENT_ID = GC
    

    只需添加日期并使用到“char”(“hh24:mi”)!