Oracle date数据类型vs sysdate

时间:2015-07-17 03:49:40

标签: sql oracle date-arithmetic

在我的表sales中,expiry date字段属于date类型。 现在,我必须编写查询,选择到期日大于当前系统日期的所有记录。

select * from Sales where expiry_date > sysdate;

在输出中我得到所有记录,有效期限为31/12/9999 00:00:00, 这是不可取的。

2 个答案:

答案 0 :(得分:3)

  

"在输出中我得到的所有记录的有效期限为31/12/9999 00:00:00,这是不可取的。"

但那是您的查询所要求的:您必须承认9999年大于当年。

因此,您的查询是正确的,并且您误解了要求,或者您需要重新编写查询以明确排除具有最大日期的记录。

据推测,在这种情况下,EXPIRY_DATE定义为NOT NULL,当有人提出永不过期的记录问题时,改变它为时已晚。所以我们的魔术值是31-12-9999,这意味着"这些记录不会过期"。

无论如何,这是现在的查询:

select * from Sales 
where expiry_date > sysdate
and expiry_date != date '9999-12-31';

这是魔术值的常见问题:它们为架构问题提供快速解决方案,但对应用程序逻辑征收持续税。

答案 1 :(得分:0)

啊,到时候结束,将来到目前为止系统存储它的日期不可能真正遇到它。问题在于系统有一种令人讨厌的习惯,这种习惯在某种形式上比预期的持续时间更长。

尽管如此,看起来你想要排除时间的结束,因为假设那些记录并没有真正到期,但是天哪,你需要某种日期才能使该索引工作你希望它的方式。

因此,您需要直接排除过期日期等于时间结束值的记录,或使用同样的范围条件:

where expiry_date between sysdate and date '9999-12-30 23:59:59'