比较DATE类型的值 - Oracle

时间:2011-03-07 18:35:02

标签: sql oracle plsql oracle10g

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

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

上述数据的列声明为数据类型DATE。阅读它似乎DATE数据类型不存储毫秒。这是否意味着 我不能比较上面两个日期,找出哪一个在另一个之前?

修改

我在Solaris上使用Oracle 10G。

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

DATE仅存储到秒。因此,如果在同一秒中插入两行,则无法确定哪一行基于CREATION_DTM列。如果你想要那个级别的分辨率,你最好使用TIMESTAMP [WITH [LOCAL] TIME ZONE]列,如果主机操作系统提供这种级别的粒度(大多数Unix系统将提供微秒),它将存储时间组件最多9位小数。分辨率)。

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

答案 2 :(得分:0)

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