在我的表sales
中,expiry date
字段属于date
类型。
现在,我必须编写查询,选择到期日大于当前系统日期的所有记录。
select * from Sales where expiry_date > sysdate;
在输出中我得到所有记录,有效期限为31/12/9999 00:00:00
,
这是不可取的。
答案 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'