【问题标题】:How to query timestamp columns with T and Z in Oracle 11?如何在 Oracle 11 中查询带有 T 和 Z 的时间戳列?
【发布时间】:2021-08-29 14:38:53
【问题描述】:

如果我执行以下查询,

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),而另一个工具直接在查询中使用它。但是,我可以自己更改查询。那里的时间戳称为变量。

【问题讨论】:

    标签: sql oracle oracle11g timestamp


    【解决方案1】:

    如果您的 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')
    

    请注意表列数据类型。


    如果秒后有数字,例如 10:38:10.11956,格式是什么?

    为小数秒添加.FF

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

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

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

    【讨论】:

    • 如果秒后有数字,例如10:38:10.11956,格式是什么?
    • @MetallicPriest - 使用 FF 表示秒数。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-08-24
      • 2019-11-11
      • 2015-03-28
      • 2020-07-10
      • 1970-01-01
      • 2017-03-09
      • 2019-03-16
      • 2015-05-30
      • 2014-11-26
      相关资源
      最近更新 更多