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的主要内容,如果未能解决你的问题,请参考以下文章

oracle学习

在 oracle 中比较日期与 sysdate

Oracle数据类型和内置函数

Oracle sysdate 不等于存储日期 [重复]

Oracle--数据增删改

ORACLE PL/SQL - 使用 SYSDATE 检索特定日期的数据时出现检索问题