【问题标题】:Oracle - Date comparison with SYSDATEOracle - 与 SYSDATE 的日期比较
【发布时间】:2018-11-22 07:00:26
【问题描述】:

我需要使用 SYSDATE 将日期与当前日期进行比较,如下所示:

SELECT * FROM my_table
WHERE date_column BETWEEN TO_DATE(SYSDATE -3,'dd.mm.yyyy') AND TO_DATE(SYSDATE,'dd.mm.yyyy');

但是,这不会产生任何结果....我的问题:

根据接受的答案here,我们永远不应该将字符串与日期进行比较。但另一方面,SYSDATE 已经是 Date 数据类型,我们不应该将它与日期进行比较 - see here

如果我在上层 SQL 中将 TO_DATE 替换为 TO_CHAR ,事情就会重新开始工作。但是 TO_CHAR 函数会转换为字符串,因此 Oracle(我认为)需要再次将此字符串转换为日期,因此您强制 Oracle 进行隐式数据类型转换。

那么,为了避免 Oracle 工作有点慢,与日期和 SYSDATE 的正确比较应该是什么?

【问题讨论】:

  • 从不,永远不要在已经是日期的值上调用 to_date()。这将首先将date 值转换为varchar,然后将varchar 转换回最初的date
  • 您误解了第二个链接。正如@a_horse_with_no_name 所写以及两个答案所建议的那样,当类型已经正确时,请避免使用类型转换函数(例如TO_DATETO_CHAR),因为您会看到奇怪的结果,因为在这种情况下您实际上得到了 两个类型的转换,你只控制一个。总而言之,要回答您的问题,我们需要知道,date_column 使用的实际类型是什么?

标签: oracle date


【解决方案1】:

您不需要致电TO_DATETO_CHAR

SELECT *
FROM my_table
WHERE date_column >= TRUNC(SYSDATE - 3) AND date_column < TRUNC(SYSDATE + 1);

假设date_column 是一个日期类型,您应该能够直接将它与SYSDATESYSDATE 偏移一些天数进行比较。

【讨论】:

  • TO_DATE 的使用可能有一个副作用,@Lucy82 可能想要,即时间截断,所以声明应该是 date_column BETWEEN TRUNC(SYSDATE - 3) AND SYSDATE 甚至 date_column &gt;= TRUNC(SYSDATE - 3) AND date_column &lt; TRUNC(SYSDATE+1)
  • @Hilarion 我非常同意你的第二个问题。
  • 查询逻辑和优化在很大程度上是两个不同的东西。例如,如果您希望我的查询快速运行,您可能会考虑向表中添加索引。
  • " 问题是所有插入都是通过选择和连接超过 5 亿行的表来完成的,因此查询运行缓慢" - 截断 sysdate 不会导致性能下降问题。您需要解决以下一项或多项问题:次优查询(例如连接选择)、过时的统计信息、错误的索引策略或糟糕的数据模型。
猜你喜欢
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多