2016-04-08 60 views
2

處理以下查詢。SQL UTC日期而不是SYSDATE

SELECT MIN(departure_date), ch_invoice.invoice_id 
FROM ch_invoice 
INNER JOIN ch_trip 
ON ch_invoice.invoice_id = ch_trip.invoice_id 
WHERE departure_date < SYSDATE 
AND service_rendered = 0 
AND paid = 1 
Group By ch_invoice.invoice_id 

因爲它擊中可能是在該日期尚未改變位置的數據庫,我們使用UTC作爲我們的日期的標準,是有可能的東西,如UTCDATE代替SYSDATE ?我只需要知道UTC當前的日期。

回答

3

正如AntDC建議的那樣,您可以使用the SYS_EXTRACT_UTC() function。這將「時區與日期時間」從任何時區轉換爲UTC。

SYSDATE沒有時區。如果你通過它,那麼它會隱式轉換到系統時區,所以它可以工作,但是可以使用SYSTIMESTAMP,因爲它已經是區域感知的。

您在評論中說過要使用日期,但所有Oracle日期都有時間組件;你可以用(這是有道理的,你做的比較)與TRUNC()設置爲午夜時得到的結果爲日期類型

select systimestamp, 
    sys_extract_utc(systimestamp) as utctime, 
    trunc(sys_extract_utc(systimestamp)) as utcdate 
from dual; 

SYSTIMESTAMP      UTCTIME     UTCDATE 
-------------------------------- ------------------------- ------------------- 
2016-04-08 17:18:27.352 +01:00 2016-04-08 16:18:27.352 2016-04-08 00:00:00 

這是在英國的服務器上運行,所以當地時間是BST。

由於不涉及每日變化,其效果可以使用會話的時間,而不是服務器的時間證明:

alter session set time_zone = '+12:00'; 

select current_timestamp, 
    sys_extract_utc(current_timestamp) as utctime, 
    trunc(sys_extract_utc(current_timestamp)) as utcdate 
from dual; 

CURRENT_TIMESTAMP    UTCTIME     UTCDATE 
-------------------------------- ------------------------- ------------------- 
2016-04-09 04:23:17.910 +12:00 2016-04-08 16:23:17.910 2016-04-08 00:00:00 

我的會議時間是2016年4月9日,但仍發現UTC日期爲2016-04-08。

(要清楚,我不建議切換到使用current_timestampcurrent_date;我使用的systimestampsysdate純粹作爲演示者,而不是)。

+0

您的編輯預期了我的問題並回答了它。謝謝!這很清楚。我相信這實現了我正在尋找的東西。 – CheeseFry

1
SELECT SYS_EXTRACT_UTC(departure_date)UTC_SYS, SYSTIMESTAMP FROM DUAL; 
+0

謝謝你的片段。你能解釋它在做什麼嗎? – CheeseFry

+0

http://psoug.org/definition/SYS_EXTRACT_UTC.htm SYS_EXTRACT_UTC是返回給定日期 – AntDC

+0

UTC日期函數你不是應該轉換系統時間,而不是表時間,即SYS_EXTRACT_UTC(SYSTIMESTAMP) ?如果您在'departure_date'上調用它,並且這是一個DATE類型,它會首先隱式轉換爲系統時區,這可能會導致奇怪的結果,因爲它聽起來像存儲值應該已經是UTC。 –