在当地时区获取日期/时间

时间:2014-01-30 03:28:51

标签: sql oracle datetime timezone

[我认为我已经做对了,但想检查一下。做时区的事情有时会让我头疼!]

我有一个表格,其中包含一个普通的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。

2 个答案:

答案 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;