[英]How to unite two columns of date + time for datediff - Oracle sql
我有兩個int列: thedate - 例如 20210512 thetime - 例如 142342
所以,我需要將它們合並到一列以檢查時差是否低於 5。
我試過這個:
TO_DATE(sysdate) - TO_DATE(thedate, 'YYYY-MM-DD') < 5
但它只適用於日期而不是時間,所以我很高興知道如何將兩個 int 列 + 合並並將其轉換為日期類型以獲得時差。
您想轉換為時間戳,而不是日期。 所以:
select to_timestamp(cast(20210512 * 1000000 + 142342 as varchar2(255)), 'YYYYMMDDHH24MISS')
from dual;
這是一個 db<>fiddle 表明這是有效的。
或者在where
子句中:
to_timestamp(cast(thedate * 1000000 + thetime as varchar2(255)), 'YYYYMMDDHH24MISS') > sysdate - interval '5' day
(或者你所說的“5”)。
注意:您可能希望將計算列添加到具有完整時間戳的表中:
alter table t add column timestamp generated always as
( to_timestamp(cast(thedate * 10000 + thetime as varchar2(255)), 'YYYYMMDDHH24MISS') );
您可以使用:
SELECT *
FROM table_name
WHERE TO_DATE( thedate * 1000000 + thetime, 'YYYYMMDDHH24MISS' ) > SYSDATE - 5;
其中,對於樣本數據:
CREATE TABLE table_name ( thedate INT, thetime INT );
INSERT INTO TABLE_NAME ( thedate, thetime ) VALUES (
TO_NUMBER( TO_CHAR( SYSDATE, 'YYYYMMDD' ) ),
TO_NUMBER( TO_CHAR( SYSDATE, 'HH24MISS' ) )
);
INSERT INTO TABLE_NAME ( thedate, thetime ) VALUES (
TO_NUMBER( TO_CHAR( SYSDATE - INTERVAL '4 23' DAY TO HOUR, 'YYYYMMDD' ) ),
TO_NUMBER( TO_CHAR( SYSDATE - INTERVAL '4 23' DAY TO HOUR, 'HH24MISS' ) )
);
INSERT INTO TABLE_NAME ( thedate, thetime ) VALUES (
TO_NUMBER( TO_CHAR( SYSDATE - INTERVAL '5 1' DAY TO HOUR, 'YYYYMMDD' ) ),
TO_NUMBER( TO_CHAR( SYSDATE - INTERVAL '5 1' DAY TO HOUR, 'HH24MISS' ) )
);
輸出:
日期 時間 20210512 131832 20210507 141832
或者,如果您想在thedate
和thetime
列上使用索引(上面的查詢不會在thedate
和thetime
列上使用索引,但需要基於函數的索引)然后:
SELECT *
FROM table_name
WHERE thedate > TO_NUMBER( TO_CHAR( SYSDATE - 5, 'YYYYMMDD' ) )
OR ( thedate = TO_NUMBER( TO_CHAR( SYSDATE - 5, 'YYYYMMDD' ) )
AND thetime >= TO_NUMBER( TO_CHAR( SYSDATE - 5, 'HH24MISS' ) )
)
但是,更好的解決方案是為您的數據使用適當的數據類型; 在這種情況下,您應該將日期值存儲在DATE
數據類型(在 Oracle 中,包含年秒組件)中,而不是作為日期和時間的兩個INT
值。
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.