【问题标题】:Oracle DB query with different time zones具有不同时区的 Oracle DB 查询
【发布时间】:2021-04-14 10:38:37
【问题描述】:

我有一个带有 Python 脚本的 VM,它通过 cx_Oracle 模块连接到 Oracle 数据库。

问题是虚拟机位于 UTC 时区,但数据库位于 Europe/Lisbon 时区,因此,在夏令时更改后,它们未对齐:

select current_timestamp from dual; --21.04.14 10:26:34,902780 +00:00
select systimestamp from dual; --21.04.14 11:27:04,542267 +01:00

我正在对包含 DATE 类型列的表进行查询,称为 CREATION_DATE

SELECT
    count(*)
FROM
    MY_TABLE
WHERE
    CREATION_DATE >= TO_DATE('13/04/2021 14:00:00', 'DD/MM/YYYY HH24:MI:SS') 
AND 
    CREATION_DATE < TO_DATE('13/04/2021 15:00:00', 'DD/MM/YYYY HH24:MI:SS');

这些日期值是从 VM 本地时间(以 UTC 表示)填充的。该表在该范围内有一些带有CREATION_DATE 的记录,但在葡萄牙时区(夏季为+1),因此无法使用此查询检索它们:

CREATION_DATE
-------------------
13/04/2021 15:20:47
13/04/2021 15:20:47
13/04/2021 15:20:47
13/04/2021 15:20:47

此查询一直有效,直到夏令时更改。如何重建查询以便正确检索这些记录,而与一年中的时间无关?

【问题讨论】:

  • CREATION_DATE 列的数据类型是什么 - 它包括时区吗?此外,您的查询/数据中的任何内容似乎都不受时区的影响 - 您的查询不会返回任何记录,因为没有记录的日期/时间在您在 WHERE 子句中硬编码的范围内。例如,如果您使用诸如 CURRENT_DATE 之类的函数,我可以理解可能存在问题
  • 该列是 DATE 类型,不包括时区。我无法使用这些函数,因为该日期实际上并未硬编码,我是从运行查询的 Python 脚本中获取的。
  • 如果您使用的是 DATE 数据类型,那么数据库或其他任何人都无法判断出由于夏季时间的变化,您必须调整小时部分。 CREATION_DATE 中的所有日期都在同一个时区吗?

标签: sql oracle time


【解决方案1】:

我已经找到了解决方案。由于我希望 VM 始终处于 UTC 时区,并且我也不想更改数据库时区,所以我可以使用这个:

SELECT CAST(
    TO_TIMESTAMP_TZ(
        '13/04/2021 14:00:00 UTC',
        'DD/MM/YYYY HH24:MI:SS TZR'
    ) AT TIME ZONE 'Europe/Lisbon' AS DATE
) FROM DUAL;

这将返回从 UTC 时区转换为欧洲/里斯本时区的值:

13/04/2021 15:00:00

将此应用到我的查询中,它会是这样的:

SELECT
    count(*)
FROM
    MY_TABLE
WHERE
    CREATION_DATE >= CAST(
        TO_TIMESTAMP_TZ(
            '13/04/2021 14:00:00 UTC',
            'DD/MM/YYYY HH24:MI:SS TZR'
        ) AT TIME ZONE 'Europe/Lisbon' AS DATE
    )
AND 
    CREATION_DATE < CAST(
        TO_TIMESTAMP_TZ(
            '13/04/2021 15:00:00 UTC',
            'DD/MM/YYYY HH24:MI:SS TZR'
        ) AT TIME ZONE 'Europe/Lisbon' AS DATE
    );

我得到了想要的结果:

  COUNT(*)
----------
         4

【讨论】:

  • 当您在 WHERE 子句中硬编码日期/时间时,在您的头脑中转换为 UTC(即加/减 1 小时)并将适当的时间放在您的 WHERE 中不是更简单吗子句?
猜你喜欢
  • 1970-01-01
  • 2016-10-12
  • 2020-08-09
  • 1970-01-01
  • 2012-02-06
  • 2021-09-15
  • 2017-01-25
  • 2020-03-31
  • 2014-04-28
相关资源
最近更新 更多