【问题标题】:Oracle SQL Where Clause against a date column针对日期列的 Oracle SQL Where 子句
【发布时间】:2011-05-04 17:13:01
【问题描述】:

我有一个包含日期的 DATE 列,但我需要查询它以查找不到 30 天的记录。

START_DATE
----------
01-AUG-2010
09-AUG-2010
22-AUG-2010
09-SEP-2010

查询:

SELECT START_DATE
 WHERE START_DATE < 30;

我知道这是 ORACLE SQL 中的简单查询,但我做错了。

【问题讨论】:

标签: sql oracle oracle10g oracle9i date-arithmetic


【解决方案1】:

用途:

SELECT t.start_date
  FROM YOUR_TABLE t
 WHERE t.start_date > SYSDATE - 30
  • SYSDATE 是 Oracle 获取当前日期和时间的语法
  • 在 Oracle 中,您可以在天的上下文中进行日期算术,因此 SYSDATE - 30 表示“当前日期,减去三十天”以获得过去三十天的日期

如果您想根据午夜后的三十天来评估日期,请使用TRUNC function

SELECT t.start_date
  FROM YOUR_TABLE t
 WHERE t.start_date > TRUNC(SYSDATE) - 30

不要在列上运行 TRUNC - 这将使列上的索引无用,从而确保进行表扫描。

【讨论】:

  • 或者,您可以尝试where months_between (sysdate,t.start_date) &lt;= 1。虽然我认为你可能会得到略有不同的结果,具体取决于所讨论的月份的长度。 months_between 存在于 Oracle 上,但我不知道是否有其他数据库实现了类似的功能。
  • @FrustratedWithFormsDesigner:是的,但不能保证加/减一个月是 30 天——IE 从 3 月 29 日开始减一个月... :)
  • 是的。有时要求会说“在……之前 3 个月”,有时他们会说“在……之前 90 天”,有些人似乎认为它们是等价的,所以当他们的意思是另一个时,他们说一个。所以我按照一个标准编码只是为了发现他们的意思是另一种方式......
  • @FrustratedWithFormsDesigner:是的,我是有限需求的忠实拥护者——一般来说,敏捷开发会适得其反,但我也没有看到为客户不理解的东西编码的意义。浪费我们的时间和他们的钱......但有些人需要它来掌握他们真正想要的东西:/
【解决方案2】:
SELECT t.start_date
  FROM YOUR_TABLE t
 WHERE t.start_date > SYSDATE - INTERVAL '30' DAY;

INTERVAL 比假设您可以增加或减少天数更具可移植性,尽管我注意到 Oracle 和 PostgreSQL 之间的 INTERVAL 语法略有不同。

【讨论】:

  • 日期处理在数据库之间不是很便携,很遗憾。
【解决方案3】:

WHERE START_DATE > SYSDATE - 1

或许

TRIM(STARTDATE) > TRIM(SYSDATE) - 1

【讨论】:

  • 我认为在 Oracle 中,向日期添加(或减去)一个数字会增加很多 ,因此您只需从 sysdate 中减去 1 天。另外,我不确定你为什么要修剪 sysdate。
  • @FrustratedWithFormsDesigner:我觉得他的意思是TRUNC,但是对着表格列跑就不好了。
猜你喜欢
  • 1970-01-01
  • 2017-09-16
  • 2016-09-07
  • 2023-03-31
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2019-10-21
  • 2011-04-21
相关资源
最近更新 更多