Oracle 日期数据类型与 sysdate
Posted
技术标签:
【中文标题】Oracle 日期数据类型与 sysdate【英文标题】:Oracle date datatype vs sysdate 【发布时间】:2015-10-06 17:16:50 【问题描述】:在我的表sales
中有expiry date
字段是date
类型。
现在,我必须编写查询来选择所有 expiry date 大于 current 系统日期的记录。
select * from Sales where expiry_date > sysdate;
在输出中我得到 all 到期日期31/12/9999 00:00:00
的记录,
这是不希望的。
【问题讨论】:
请提供一些示例数据以及您期望的输出 那是mysql还是oracle? @Alariva 它是预言机 @bish 销售中有不同的到期日期我想打印到期日期大于今天的记录。 @bish 就像我有两条记录的有效期分别为 11-12-2014 和 12-12-2015,然后我希望只打印第二条。 【参考方案1】:" 在输出中,我正在获取所有到期日期为 31/12/9999 00:00:00 的记录,这是不需要的。"
但这正是您的查询所要求的:您必须承认 9999 年大于当前年份。
所以要么您的查询是正确的并且您误解了要求,要么您需要重新编写查询以明确排除具有最大日期的记录。
大概在这种情况下,EXPIRY_DATE 被定义为NOT NULL
,当有人提出永不过期的记录问题时,更改它为时已晚。因此,我们有一个 31-12-9999 的 magic value,这意味着“这些记录不会过期”。
无论如何,现在是查询:
select * from Sales
where expiry_date > sysdate
and expiry_date != date '9999-12-31';
这是魔术值的常见问题:它们为架构问题提供了快速解决方案,但对应用程序逻辑征收持续税。
【讨论】:
当我使用时从销售中选择到期日期;我得到了保存在表格中的确切日期。但是当我使用我提到的上述查询时,在输出中我将所有到期日期都设为 31/12/9999 00:00:00。 这样的问题,您将不得不发布一些示例数据和实际查询。【参考方案2】:啊,时间的尽头,一个到目前为止的日期,存储它的系统不太可能真正遇到它。这样做的问题是,系统有一个令人讨厌的习惯,即以一种或另一种形式存在的时间比预期的要长。
尽管如此,您似乎想排除时间的结束,因为假设这些记录并没有真正过期,但是天哪,您需要某种日期才能使该索引起作用你想要的方式。
因此,您要么需要直接排除到期日期等于您的时间结束值的记录,要么使用执行相同操作的范围条件:
where expiry_date between sysdate and date '9999-12-30 23:59:59'
【讨论】:
between
是错误的,因为它的下界是>=
; OP 的查询仅指定大于。以上是关于Oracle 日期数据类型与 sysdate的主要内容,如果未能解决你的问题,请参考以下文章