2014-01-30 82 views
-2

[I 認爲我有這個權利,但想檢查。做時區的東西有時候會讓我頭腦發熱!]在當地時區獲取日期/時間

我有一張表格,其中包含一個表示期望交付日期(無時間值)的普通DATE列。我可以將其鏈接到另一張表格,該表格提供了澳大利亞國家代碼。我想確定交付時間是否到達,並記住服務器運行在單個時區(例如澳大利亞/珀斯),並且不得早於下午3點向客戶發送通知。

所以要確定什麼時候(在服務器上)我應該發送通知。如果客戶記錄是在悉尼創建的,並且我等到下午3點,那就太晚了,因爲珀斯的下午3點是悉尼的下午5點或下午6點,這取決於夏令時間。

的樣本數據:

CREATE TABLE custorders 
    (delivery_date DATE 
    ,state   VARCHAR2(3)); 

INSERT INTO custorders VALUES (DATE '2014-01-30', 'ACT'); 
INSERT INTO custorders VALUES (DATE '2014-01-30', 'NSW'); 
INSERT INTO custorders VALUES (DATE '2014-01-30', 'NT'); 
INSERT INTO custorders VALUES (DATE '2014-01-30', 'QLD'); 
INSERT INTO custorders VALUES (DATE '2014-01-30', 'SA'); 
INSERT INTO custorders VALUES (DATE '2014-01-30', 'TAS'); 
INSERT INTO custorders VALUES (DATE '2014-01-30', 'VIC'); 
INSERT INTO custorders VALUES (DATE '2014-01-30', 'WA'); 

假設服務器在珀斯(華盛頓州)的運行,我們在中午12點運行作業:

預期結果:

STATE LOCAL_TIME 
===== ========== 
ACT 15:00 
NSW 15:00 
NT 13:30 
QLD 14:00 
SA 14:30 
TAS 15:00 
VIC 15:00 
WA 12:00 

我可以然後在將通知發送給該客戶之前檢查LOCAL_TIME是否> = 15:00。

+0

請注意,我只包含'delivery_date'列來說明表的用途 - 我不需要它的時區。 –

回答

0

這就是我,似乎工作 - 它不依賴任何特定位置運行在服務器上(即它假定服務器的時區設置正確):

SELECT state 
     ,TO_CHAR(
     LOCALTIMESTAMP 
     AT TIME ZONE 
      CASE state 
      WHEN 'QLD' THEN 'Australia/Queensland' 
      WHEN 'ACT' THEN 'Australia/ACT' 
      WHEN 'TAS' THEN 'Australia/Tasmania' 
      WHEN 'NSW' THEN 'Australia/NSW' 
      WHEN 'NT' THEN 'Australia/Darwin' 
      WHEN 'SA' THEN 'Australia/Adelaide' 
      WHEN 'WA' THEN 'Australia/Perth' 
      WHEN 'VIC' THEN 'Australia/Victoria' 
      END 
     ,'HH24:MI') AS local_time 
FROM custorders; 
1

萬一作業正在運行甲骨文Scheduler作業,你應該通過這個查詢檢查作業的時區:

SELECT * 
FROM ALL_SCHEDULER_GLOBAL_ATTRIBUTE 
WHERE ATTRIBUTE_NAME = 'DEFAULT_TIMEZONE' 

也許是有意義的日期列遷移到TIMESTAMP WITH TIME ZONE數據類型。或者添加這個datatye的虛擬列並使用這個。

ALTER TABLE custorders ADD (LOCAL_TIME TIMESTAMP WITH TIME ZONE GENERATED ALWAYS AS (
FROM_TZ(delivery_date, 
      CASE state 
      WHEN 'QLD' THEN 'Australia/Queensland' 
      WHEN 'ACT' THEN 'Australia/ACT' 
      WHEN 'TAS' THEN 'Australia/Tasmania' 
      WHEN 'NSW' THEN 'Australia/NSW' 
      WHEN 'NT' THEN 'Australia/Darwin' 
      WHEN 'SA' THEN 'Australia/Adelaide' 
      WHEN 'WA' THEN 'Australia/Perth' 
      WHEN 'VIC' THEN 'Australia/Victoria' 
      END) 
)); 
+0

感謝關於調度程序作業的說明。 WRT日期欄:無需更改日期欄,它只存儲日期(無時間),日期不會更改,無論澳大利亞在哪裏創建。 –

+0

請注意,我希望時間*現在*,而不是交貨日期。 –