2014-02-07 66 views
0

我遇到了一個奇怪的情況。有人可以解釋爲什麼時間戳和時間戳之間的比較行爲如下(它取決於會話時區...)。此外,在所有情況下,輸出值都是相同的。 它看起來像時間戳從會話繼承時區出於比較的目的,但打印它不?基於時區的systimestamp和Oracle上的時間戳比較

查詢:

alter session set time_zone = '-6:0'; 
select cast(systimestamp as timestamp), systimestamp, case when cast(systimestamp as timestamp) < systimestamp then 'timestamp < systm' else 'timestamp >= systm' end as cmp from dual; 
alter session set time_zone = '1:0'; 
select cast(systimestamp as timestamp), systimestamp, case when cast(systimestamp as timestamp) < systimestamp then 'timestamp < systm' else 'timestamp >= systm' end as cmp from dual; 

輸出:

CAST(SYSTIMESTAMPASTIMESTAMP) SYSTIMESTAMP      CMP    
----------------------------- ----------------------------------- ------------------ 
14/02/06 21:22:05,319973000 14/02/06 21:22:05,319973000 -06:00 timestamp >= systm 

session SET altered. 
CAST(SYSTIMESTAMPASTIMESTAMP) SYSTIMESTAMP      CMP    
----------------------------- ----------------------------------- ------------------ 
14/02/06 21:22:06,057183000 14/02/06 21:22:06,057183000 -06:00 timestamp < systm 

數據庫是在-6時區。 Oracle數據庫11g企業版版本11.2.0.3.0 - 64位生產

回答

0

SYSTIMESTAMP返回TIMESTAMP WITH TIME ZONE數據類型。看起來像甲骨文轉換TIMESTAMPTIMESTAMP WITH TIME ZONE數據類型進行比較,actualy Oracle執行此:

SELECT 
    CASE 
    WHEN CAST(CAST(SYSTIMESTAMP AS TIMESTAMP) AS TIMESTAMP WITH TIME ZONE) < SYSTIMESTAMP 
     THEN 'timestamp < systm' 
     ELSE 'timestamp >= systm' 
    END AS cmp 
FROM dual; 

對於轉換所花費的SESSION的時區,你可以用這個查詢一下:

SELECT 
    EXTRACT(TIMEZONE_HOUR FROM CAST(CAST(SYSTIMESTAMP AS TIMESTAMP) AS TIMESTAMP WITH TIME ZONE)) AS TZ_HOUR 
FROM dual; 

可以討論這是否有意義。對於正確的轉換,您最好使用FROM_TZ函數,然後在您的控制之下。在DB時區SYSTIMESTAMP回報時間戳,所以正確的說法應該是這樣一個:在這個

SELECT FROM_TZ(LOCALTIMESTAMP, DBTIMEZONE), SYSTIMESTAMP, 
    CASE FROM_TZ(LOCALTIMESTAMP, DBTIMEZONE) < SYSTIMESTAMP THEN 
    ... 
1

看: https://docs.oracle.com/cd/B12037_01/server.101/b10749/ch4datet.htm#1006334

當您比較日期和時間戳值,甲骨文將數據轉換爲更精確數據類型,然後再進行比較。例如,如果將TIMESTAMP WITH TIME ZONE數據類型的數據與TIMESTAMP數據類型的數據進行比較,則Oracle使用會話時區將TIMESTAMP數據轉換爲TIMESTAMP WITH TIME ZONE。 優先用於將日期和時間戳記數據的順序如下:1. DATE 2. TIMESTAMP 3.本地時區 4. TIMESTAMP WITH TIME ZONE 對於任何一對數據類型的時間戳,甲骨文轉換數據類型,它具有較大數字的數據類型在前面的列表中具有較小的數字。