【发布时间】: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 中的所有日期都在同一个时区吗?