如何在 Oracle 11 中使用 T 和 Z 查询时间戳列?

How to query timestamp columns with T and Z in Oracle 11?

如果我执行以下查询,

select dt from table where dt <= timestamp '2021-06-01T10:45:00Z'

我得到 ORA-01861: literal does not match format string error。但是,如果我从字符串中删除 T 和 Z,它就可以正常工作。

所以,我的问题是,如何在此处查询带有 T 和 Z 的时间戳。我需要能够做到这一点,因为时间戳是由这种格式的工具返回的(因此,我不能自己删除 T 和 Z),而另一个工具直接在查询中使用它。但是我可以自己更改查询。那里的时间戳被称为变量。

暴力方法将使用 to_timestamp_tz() 并用小时偏移量替换时区:

to_timestamp_tz(replace('2021-06-01T10:45:00Z', 'Z', ' +00'), 'YYYY-MM-DD"T"HH:MI:SS TZH')

如果您的 dt 列是没有时区或日期的时间戳,并且您忽略了固定字符串中的时区,那么您可以这样做:

where dt <= to_timestamp('2021-06-01T10:45:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z")

where dt <= to_date('2021-06-01T10:45:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z")

如果您想遵守时区,例如dt 是一个带时区的时间戳,那么你可以将值声明为UTC:

where dt <= from_tz(to_timestamp('2021-06-01T10:45:00Z', 'YYYY-MM-DD"T"HH24:MI:SS"Z"), 'UTC')

不过要小心 table 列数据类型。


And if have numbers after seconds, such as 10:38:10.11956, what would be the format?

为小数秒添加 .FF

to_timestamp('2021-06-01T10:38:10.11956Z', 'YYYY-MM-DD"T"HH24:MI:SS.FF"Z")

并不是说这不适用于 to_date(),因为它没有小数秒精度。如有必要,您可以将时间戳转换为日期,或 round/trunc 隐式执行此操作。

格式模型元素are in the documentation;这也显示字符文字 - 就像这种格式的 T 和 Z。