【问题标题】:How to compare two DATE values based only on date part in Oracle?如何仅根据 Oracle 中的日期部分比较两个 DATE 值?
【发布时间】:2011-09-15 15:25:22
【问题描述】:

我正在尝试使用以下查询获取过去 30 天的计数 -

SELECT date_occured, COUNT(*) FROM problem
WHERE date_occured >= (CURRENT_DATE - 30)
GROUP BY date_occured;

//date_occured field is of type DATE.

基本上,在我的查询中,我试图只比较条件date_occured >= (CURRENT_DATE - 30) 中的日期部分,但它似乎也比较了时间。

我按如下方式尝试了 TRUNC -

TRUNC(date_occured) >= TRUNC(CURRENT_DATE - 30)

但是当运行查询时它永远不会返回。

我也试过了-

SELECT date_occured, COUNT(*) FROM problem    
GROUP BY date_occured
HAVING TRUNC(date_occured) >= TRUNC(CURRENT_DATE - 30);

它再也不会回来了。

如何仅比较 Oracle 中两个 DATE 值的日期部分?

【问题讨论】:

  • 我想您需要按TRUNC(date_occured) 分组,不是吗?即你想要每天而不是每秒的结果。
  • 它永远不会返回”是什么意思

标签: sql oracle date compare datepart


【解决方案1】:

对于这种情况,您只需要 TRUNC 右侧:

WHERE date_occured >= TRUNC(CURRENT_DATE - 30)

为什么?因为如果 TRUNC(date_occured) 晚于 TRUNC(CURRENT_DATE - 30),那么 TRUNC(date_occured) 之后的任何时刻也必然晚于 TRUNC(CURRENT_DATE - 30)。

显然 date_occured >= TRUNC(date_occured) 总是正确的(想想看)。

逻辑说如果 A >= B 并且 B >= C 那么它遵循 A >= C

现在替换:

  • A : date_occured
  • B : TRUNC(date_occured)
  • C : TRUNC(CURRENT_DATE - 30)

【讨论】:

  • 我认为 trunc() 也应该应用于 date_occured 以便也忽略那个时间。另外我会改用trunc(current_date) - 30
  • 我很想知道这是否能解决问题。我一直认为,如果你在没有时间的情况下约会,那就等于什么都不做。
  • @a_horse_with_no_name - 我认为这没有任何区别。我想知道我对您的任何参考资料是否有误。谢谢。
  • @northopole:不,你是对的,它没有任何区别。我想到了 <= 条件,truncing date_occurred 会有所作为。
  • @northpole:已添加说明
【解决方案2】:

我想你也想在选择部分截断:

 SELECT TRUNC(date_occured) AS short_date_occured, COUNT(*)
 FROM problem 
 WHERE date_occured >= trunc(SYSDATE- 30) 
 GROUP BY short_date_occured;

【讨论】:

    【解决方案3】:

    尝试使用 SYSDATE 与 CURRENT_DATE。 Sysdate 使用服务器的本地时间,其中 CURRENT_DATE 以客户端连接的本地时间返回服务器的当前日期/时间。

    【讨论】:

      【解决方案4】:

      我倾向于怀疑 Tony 是正确的,而您真的只想TRUNC 表达式的右侧。

      如果您确实想要 TRUNC 表达式的两边并且遇到性能问题,您可能需要基于函数的索引

      CREATE INDEX idx_problem_trunc_dt_occured
          ON problem( trunc( date_occurred ) );
      

      这将允许您的原始查询使用基于函数的索引。

      【讨论】:

        【解决方案5】:

        这是索引友好的方法。

        如果您使用 Oracle 的原生 MONTHS_BETWEEN 函数,则不需要在列上使用函数。

        它返回月数的差异。天数也作为差异给出,但在精确方面,这就是我更喜欢使用 BETWEEN 子句的原因

        WHERE MONTHS_BETWEEN(date_occured, CURRENT_DATE - 30) BETWEEN 0 AND 1
        

        【讨论】:

          猜你喜欢
          • 2014-01-27
          • 2011-12-02
          • 2021-05-28
          • 1970-01-01
          • 1970-01-01
          • 2017-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多