【问题标题】:Comparing values of type DATE - Oracle比较 DATE 类型的值 - Oracle
【发布时间】:2011-03-08 17:01:00
【问题描述】:

有没有办法比较日期值来检查一个是否在另一个之前? 例如,我怎么知道后面几行中哪个先出现

SEQ   CREATION_DTM
--------------------
234   2011-03-26 22:59:03
235   2011-03-26 22:59:03

上述数据的列被声明为数据类型 DATE。仔细阅读后,似乎 DATE 数据类型不存储毫秒。意思是不是 我无法比较以上两个日期来找出哪个日期在另一个之前?

编辑

我在 Solaris 上使用 Oracle 10G。

【问题讨论】:

    标签: sql oracle plsql oracle10g


    【解决方案1】:

    DATE 精度仅精确到秒,因此如果您有两个与该精度相同的日期,则无法区分或排序它们。要获得更高的精度,您需要将它们存储为 TIMESTAMP

    在日期确实不同的更一般情况下,您可以像数字一样比较和排序它们。当你得到两个相同的结果时,结果是不确定的;在您的情况下,如果您按CREATION_DTM 订购,那么您无法可靠地预测结果是按234,235 还是235,234 订购。正如贾斯汀建议的那样,您需要确定一种打破平局的方法。

    【讨论】:

    • 比赛是乐趣的一半。尽管通常会输。
    【解决方案2】:

    DATE 最多只能存储第二个。因此,如果在同一秒内插入两行,您无法根据 CREATION_DTM 列确定哪一行先出现。如果您想要该级别的分辨率,最好使用TIMESTAMP [WITH [LOCAL] TIME ZONE] 列,如果主机操作系统提供该级别的粒度(大多数 Unix 系统将提供微秒分辨率),它将存储最多 9 个十进制数字的时间组件.

    在您的情况下,假设您没有使用 RAC 并且您使用 Oracle 序列来填充 SEQ 列,您可以使用该列来打破平局。如果这两行插入到不同的事务中,尚未更新,并且表是使用ROWDEPENDENCIES 构建的,那么您也可以使用ORA_ROWSCN 来打破平局。

    【讨论】:

    • 可以用rowid来检查先插入哪一行吗?
    • @Ziggy - 不。ROWID 是物理地址。没有理由期望表中行的物理顺序与插入行的顺序相匹配,尤其是在删除或更新行时。
    【解决方案3】:

    似乎时间戳数据类型适合您查询.. 谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 2011-03-11
      • 2015-05-14
      • 1970-01-01
      • 2012-10-10
      相关资源
      最近更新 更多