[英]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);
這是結果。
00:00:11
您可以將其轉換為間隔,然后使用TO_CHAR
將間隔轉換為字符串:
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.