簡體   English   中英

Oracle SQL To_Char(interval) 沒有使用我的格式字符串?

[英]Oracle SQL To_Char(interval) is not using my format string?

在 SQL 的以下位中,我想以 HH:MM:SS 格式打印一個間隔(實際上是幾秒)。 我將秒數轉換為間隔,然后嘗試使用 TO_CHAR 日期格式。 Oracle 服務器忽略我的模式並打印一個完整的時間戳,日期和微秒中的字符為零。 我究竟做錯了什么?

CASE WHEN (TR.RUN_LENGTH > 0) THEN TO_CHAR(NUMTODSINTERVAL(TR.RUN_LENGTH,'second'), 'HH24:MI:SS')
ELSE '0' END AS RUN_LENGTH,

我得到:+000000000 00:03:22.000000000

正如您所觀察到的, to_char()不適用於間隔。 所以,不要考慮間隔。 相反,您有幾秒鍾的時間,並且想要轉換為 HH:MM:SS 格式的字符串。

使用算術和字符串運算:

select lpad(floor(tr.run_length / 3600), 2, '0') || ':' || lpad(mod(floor(tr.run_length / 60),  60), 2, '0') || ':' || lpad(mod(tr.run_length, 60), 2, '0') as hhmmss
from (select 1 as run_length from dual union all
      select 10 as run_length from dual union all
      select 100 as run_length from dual union all
      select 1000 as run_length from dual union all
      select 10000 as run_length from dual union all
      select 100000 as run_length from dual 
     ) tr;

是一個 db<>fiddle。

我搜索了其他相關回復; 很明顯,Oracle 實際上並沒有為 TO_CHAR(DSINTERVAL) 實現用戶指定的格式。 正如一些人所建議的,您可以添加一個日期,然后使用日期格式。 但如果間隔超過 24 小時,則會失敗。

我最終使用了 REGEXP_SUBSTRING() 但后來遇到了 Oracle 顯然不支持非捕獲組的問題。 我能夠拼湊出這個:

REGEXP_SUBSTR(TO_CHAR(NUMTODSINTERVAL(TR.RUN_LENGTH,'second')), '^([\+0:\ ]*)(.*)(\.)',1,1,NULL,2 )

這似乎工作得很好。 它抑制任何前導零和小數秒。

如果您的時間間隔始終少於 24 小時,那么您可以使用以下方法之一:

TO_CHAR(TRUNC(SYSDATE) + NUMTODSINTERVAL(TR.RUN_LENGTH, 'second'), 'hh24:mi:ss')

REGEXP_SUBSTR(NUMTODSINTERVAL(TR.RUN_LENGTH,'second'), '\d{2}:\d{2}:\d{2}')

否則,您需要使用EXTRACT function:

SELECT
    TO_CHAR(
       EXTRACT(DAY FROM NUMTODSINTERVAL(TR.RUN_LENGTH,'second')) * 24 
       + EXTRACT(HOUR FROM NUMTODSINTERVAL(TR.RUN_LENGTH,'second')) )
   || ':' EXTRACT(MINUTE FROM NUMTODSINTERVAL(TR.RUN_LENGTH,'second') 
   || ':' TRUNC(EXTRACT(SECOND FROM NUMTODSINTERVAL(TR.RUN_LENGTH,'second'))

如果 output 需要,您可以選擇在零件周圍添加LPAD(..., 2, '0')

更少的代碼:

to_number(
substr(to_char((LATER_timestamp - EARLIER_timestamp),'HH24:MI:SS'), 1,10) /* this is the DAY  string */ 
) || 'd ' ||
substr(to_char((LATER_timestamp - EARLIER_timestamp),'HH24:MI:SS'),12,11) /* this is the TIME string.  Milliseconds are "FLOORED". */

示例 output 是:“2d 02:59:57.31”。

嘗試這個:

TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL ((TR.RUN_LENGTH, 'second'),   
    'hh24:mi:ss' )

NUMTODSINTERVAL 的文檔說它返回一個字符串文字,所以 to_char 沒有效果。 上面的這個 hack 只取當前日期/時間(sysdate),截斷 HH:mm:ss 組件,然后加回您指定的#seconds,然后將其格式化為僅顯示 HH:MM:SS 值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM