【问题标题】:Comparing two dates in Oracle after using TO_DATE function使用 TO_DATE 函数后比较 Oracle 中的两个日期
【发布时间】:2020-03-10 10:49:27
【问题描述】:

我有以下 Oracle 查询,它将今天的日期和表中的日期字段转换为相同的格式。但是,当尝试比较两者时,它们的结果并不相同。

CAST(dstamp As Date), TO_DATE(CURRENT_DATE,'dd-MON-YY HH24.MI.SS','NLS_DATE_LANGUAGE = American')

演员表用于我表中的字段,这两个都返回。

但是,当添加以下 where 语句时,不会返回任何行。我不明白为什么这些不能被归类为平等?

WHERE CAST(dstamp As Date) = TO_DATE(CURRENT_DATE,'dd-MON-YY HH24.MI.SS','NLS_DATE_LANGUAGE = American');

任何帮助表示赞赏。

【问题讨论】:

  • CURRENT_DATE 返回一个 DATE 值。 从不对已经是 DATE 的值运行 TO_DATE

标签: sql oracle date where-clause


【解决方案1】:

如果您想检查dstamp 是否属于当天,我建议:

where dstamp >= trunc(sysdate) and dstamp < trunc(sysdate) + 1

虽然有点冗长,但这将比在被比较的列上应用日期函数更有效。在谓词中的列上使用函数会使查询成为非 SARGable,即它不能利用现有索引。

【讨论】:

  • 谢谢,这也有效,我把它搞得太复杂了!
【解决方案2】:

日期已经是一个日期。你不需要转换它。您可能需要删除时间组件。这符合您的要求吗?

WHERE TRUNC(dstamp) = TRUNC(sysdate)

【讨论】:

  • 谈论过于复杂的事情!这工作谢谢你
  • 如果比较TRUNC(dstamp) = TRUNC(sysdate),Oracle 不会在dstamp 列上使用索引;如果您确实想使用索引,则需要在 TRUNC(dstamp) 上创建一个基于函数的索引。
  • @MT0 。 . .我想提一下,但是 OP 的原始代码也不是索引安全的。另外,Oracle 支持基于函数的索引,因此可能存在包含trunc(dstamp) 的索引。
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
相关资源
最近更新 更多