首页 > 解决方案 > Oracle 时间戳之间的差异

问题描述

我正在尝试运行查询,但在计算两个时间戳之间的差异的部分代码中,显示了以下错误。

  1. 00000 - “在日期时间或间隔中未找到指定字段” *原因:在日期时间或间隔中未找到指定字段。*Action:确保指定的字段在日期时间或时间间隔内

部分代码:

SYSTIMESTAMP - DT_PROP

DT_PROP 的类型是 TIMESTAMP(6)。

如果有人可以向我发送解决此问题的建议,我将不胜感激。

标签: oracle

解决方案


这是正在发生的事情。

SYSTIMESTAMP 是一个带时区的时间戳。DT_PROP 是一个时间戳(没有时区)。您正在获取不同数据类型的两个值之间的差异。

Oracle 不会抛出错误;它将进行隐式转换。从带时区的时间戳转换为简单的时间戳会丢失信息;所以,甲骨文不会那样做。相反,Oracle 则相反:它将时间戳 (DT_PROP) 向上转换为带有时区的时间戳。为此,它必须做出一个假设:它假设时区与您的系统时区相同。

如果您的系统时区支持 DST(夏令时),并且纯时间戳(无时区)在该支持 DST 的时区中无效,那么它就会遇到麻烦。

例如,在洛杉矶(美国),2020 年的夏令时从 3 月 8 日开始 - 时钟在凌晨 2 点前移一小时 - 这意味着以一秒为间隔,01:59:59 之后的时间是03:00:00。一天中的时间 02:30:00,例如,在日期 2020-03-08,根本不存在。

这是 Oracle 将抛出您报告的确切错误的情况之一。这完全有可能是它从你的代码中抛出的原因。

解决方案?有一些; 但你有一个数据问题。如果存储在 DT_PROP 中的时间戳应该代表您的 DST 感知时区中的时间,并且您在列中存储了一个无效值,那是怎么回事?围绕它编写代码很容易,但您的业务用户不应该首先提醒这一点吗?我相信他们应该。然后看看他们告诉你什么——他们希望如何处理;否则,您将为他们做出商业决策,而不仅仅是“编程”决策。


推荐阅读