oracle - Oracle 时间戳之间的差异
问题描述
我正在尝试运行查询,但在计算两个时间戳之间的差异的部分代码中,显示了以下错误。
- 00000 - “在日期时间或间隔中未找到指定字段” *原因:在日期时间或间隔中未找到指定字段。*Action:确保指定的字段在日期时间或时间间隔内
部分代码:
SYSTIMESTAMP - DT_PROP
DT_PROP 的类型是 TIMESTAMP(6)。
如果有人可以向我发送解决此问题的建议,我将不胜感激。
解决方案
这是正在发生的事情。
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 感知时区中的时间,并且您在列中存储了一个无效值,那是怎么回事?围绕它编写代码很容易,但您的业务用户不应该首先提醒这一点吗?我相信他们应该。然后看看他们告诉你什么——他们希望如何处理;否则,您将为他们做出商业决策,而不仅仅是“编程”决策。
推荐阅读
- matlab - MATLAB 中的属性初始化
- java - 无法加载平铺地图 (Libgdx)
- android - 硬件加速情况下的Android webview截图
- google-app-engine - Cannot delete a version - gcloud app versions stop [id]
- php - 为回显图像设置样式
- visual-studio - 无法在 Visual Studio 上重置颤振 sdk 路径
- python - 如何获得连续元素的频率排名?
- jquery - 预加载 Jquery 动画
- wpf - 在另一个集合中更新集合成员的属性以显示在 DataGrid 中
- c++ - 无法在 dev-c++ 上编译程序?