簡體   English   中英

Oracle SQL Hours HH:MM:SS中日期之間的時差

[英]Oracle SQL Hours Difference between dates in HH:MM:SS

我已經有一個字符串來計算從堆棧中得到的兩個日期之間的小時差:

24 *  (to_date(to_char(stp.created_date,'YYYY-MM-DD hh24:mi:ss'),'YYYY-MM-DD hh24:mi:ss') -
(to_date(to_char(adhh.created_date,'YYYY-MM-DD hh24:mi:ss'),'YYYY-MM-DD hh24:mi:ss'))) diff_hours

但我想將此視為HH:MM:SS

以以下2個日期/時間為例: STP日期18年2月26日12.59.21 ADHH日期18年2月26日12.59.32

所以我想說的是00:00:11(11秒)

目前我得到的結果是-0.003小時

一如既往地感謝

假設這些列已經是日期,因此與您正在執行的字符串之間的轉換是沒有意義的,並且差異總是小於一天,則可以執行以下操作:

to_char(date '1970-01-01' + abs(stp.created_date - adhh.created_date), 'HH24:MI:SS')

這樣就得到了日期之間的差異,即一天的一小部分。 通過abs()確保它為正; 然后將該分數重新添加到標稱日期,該日期的時間為午夜。 然后將其轉換為字符串,僅在當時查看。

快速演示:

-- CTEs to supply the two date/times
with stp (created_date) as (
  select cast(timestamp '2018-02-26 12:59:21' as date) from dual
),
adhh (created_date) as (
  select cast(timestamp '2018-02-26 12:59:32' as date) from dual
)
select to_char(date '1970-01-01' + abs(stp.created_date - adhh.created_date), 'HH24:MI:SS')
from stp cross join adhh;

TO_CHAR(
--------
00:00:11

如果差異可以超過一天,但不能超過一年,則可以將格式模型更改為'FMDDD FMHH24:MI:SS'類的格式,該格式會在開始時顯示整天。

假設這些列已經是DATE值(如果不是,我強烈建議更改它),則可以將它們轉換為時間戳。 僅轉換一個值就足夠了,但是您當然可以轉換兩個值。

CAST(stp.created_date AS TIMESTAMP) - adhh.created_date AS dif

結果是INTERVAL DAY TO SECOND值,其輸出格式固定為DDD HH:MI:SS.FF 為了獲得所需的格式,您可以使用

REGEXP_SUBSTR(CAST(stp.created_date AS TIMESTAMP) - adhh.created_date, '\d{2}:\d{2}:\d{2}') AS dif

注意, TO_CHAR在一定間隔內不起作用。 因此,您必須使用REGEXP或使用EXTRACT(... FROM ...)提取組件

我會建議您在查詢中進行一些小的更改

SELECT 
TO_CHAR(TRUNC(x/3600),'FM9900') || ':' ||
TO_CHAR(TRUNC(MOD(x,3600)/60),'FM00') || ':' ||
TO_CHAR(MOD(x,60),'FM00')
 FROM DUAL   

只需將以上查詢中的“ x”替換為結果列

24 *  (
to_date(to_char(stp.created_date,'YYYY-MM-DD hh24:mi:ss'),'YYYY-MM-DD hh24:mi:ss') -
(to_date(to_char(adhh.created_date,'YYYY-MM-DD hh24:mi:ss'),'YYYY-MM-DDhh24:mi:ss')))

希望這可以幫助..

看起來您的列已經是DATE格式(應該是!)。 在這種情況下,您可以將日期之間的差作為DAY TO SECOND INTERVAL的日期。 NUMTODSINTERVAL使用NUMTODSINTERVAL函數。 然后使用EXTRACT函數,您可以獲取小時,分鍾和秒的時間間隔。

這是一個示例查詢。

WITH
    stp (created_date)
    AS
        (SELECT CAST (TIMESTAMP '2018-02-26 12:59:21' AS DATE) FROM DUAL),
    adhh (created_date)
    AS
        (SELECT CAST (TIMESTAMP '2018-02-26 12:59:32' AS DATE) FROM DUAL)
SELECT    LPAD (EXTRACT (HOUR FROM diff_int), 2, '0')   -- get hours from interval
       || ':'
       || LPAD (EXTRACT (MINUTE FROM diff_int), 2, '0') -- get minutes from interval
       || ':'
       || LPAD (EXTRACT (SECOND FROM diff_int), 2, '0') -- get seconds from interval
           AS diff_hours
FROM (SELECT NUMTODSINTERVAL (  -- get difference between the dates as an interval
                 b.created_date
                 - a.created_date,
                 'DAY'
             )
                 diff_int
      FROM stp a,
           adhh b);

這是結果。

DIFF_HOURS

00:00:11

您可以將其轉換為間隔,然后使用TO_CHAR將間隔轉換為字符串:

SQL小提琴

Oracle 11g R2架構設置

CREATE TABLE STP ( id INT, created_date DATE );
CREATE TABLE ADHH ( id INT, created_date DATE );

INSERT INTO STP  values ( 1, TIMESTAMP '2018-02-26 12:59:21' );
INSERT INTO STP  values ( 2, TIMESTAMP '2018-02-26 12:00:30' );
INSERT INTO ADHH values ( 1, TIMESTAMP '2018-02-26 12:59:32' );
INSERT INTO ADHH values ( 2, TIMESTAMP '2018-02-26 12:00:00' );

查詢1

SELECT TO_CHAR(
         ( s.created_date - a.created_date ) DAY(1) TO SECOND(0)
       ) AS diff
FROM   STP s
       INNER JOIN ADHH a
       ON ( s.id = a.id )

結果

|        DIFF |
|-------------|
| -0 00:00:11 |
| +0 00:00:30 |

查詢2 :如果您沒有日期部分(即日期始終相隔少於24小時),則只需替換0子字符串:

SELECT REPLACE(
         ( s.created_date - a.created_date ) DAY(1) TO SECOND(0),
         '0 '
       ) AS diff
FROM   STP s
       INNER JOIN ADHH a
       ON ( s.id = a.id )

結果

|      DIFF |
|-----------|
| -00:00:11 |
| +00:00:30 |

暫無
暫無

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

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