[我认为我已经做对了,但想检查一下。做时区的事情有时会让我头疼!]
我有一个表格,其中包含一个普通的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 :(得分:1)
如果作业以Oracle SCHEDULER JOB运行,您应该通过此查询检查作业的时区:
SELECT *
FROM ALL_SCHEDULER_GLOBAL_ATTRIBUTE
WHERE ATTRIBUTE_NAME = 'DEFAULT_TIMEZONE'
将日期列迁移到TIMESTAMP WITH TIME ZONE
数据类型可能是有意义的。或者添加此数据的虚拟列并使用此列。
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)
));
答案 1 :(得分: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;