【问题标题】:Oracle date datatype vs sysdateOracle 日期数据类型与 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,然后我希望只打印第二条。

标签: sql oracle date-arithmetic


【解决方案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 的查询仅指定大于。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
相关资源
最近更新 更多