【发布时间】: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_DATE,TO_CHAR),因为您会看到奇怪的结果,因为在这种情况下您实际上得到了 两个类型的转换,你只控制一个。总而言之,要回答您的问题,我们需要知道,date_column使用的实际类型是什么?