为什么这个Oracle DATE比较不起作用

时间:2017-09-29 15:04:44

标签: oracle oracle12c

在Oracle 12中,如果我创建一个非常简单的表TEST_TABLE,并使用一个varchar2(128)列'name',并使用大量'20170831'字符串填充该列,并且sysdate显示:

SELECT sysdate FROM dual;

29-SEP-17

那么为什么这个SQL查询返回0行:

SELECT TO_DATE(name,'YYYYMMDD'), 
       TO_DATE(TRUNC(SYSDATE),'DD-MM-YYYY')
    FROM TEST_TABLE
    WHERE TO_DATE(name,'YYYYMMDD') < TO_DATE(TRUNC(SYSDATE),'DD-MM-YYYY');

(这是我在分区维护脚本中遇到的问题的一个非常简化的示例,并且在上周无法解决)。 提前感谢您提供与上述查询相关的任何帮助。

2 个答案:

答案 0 :(得分:1)

午夜(时间部分是00:00:00.000):

SELECT TO_DATE(name,'YYYYMMDD'), TRUNC(SYSDATE) 
FROM TEST_TABLE
WHERE TO_DATE(name,'YYYYMMDD') <= TRUNC(SYSDATE);

您也可以尝试:

ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

答案 1 :(得分:0)

只是不要将to_date()应用于已经存在的日期字段,这是因为它会隐式地将该日期转换为varchar,然后将to_date()函数应用于它,例如您的查询部分TO_DATE(TRUNC(SYSDATE),'DD-MM-YYYY')的解释如下:

TO_DATE(TO_CHAR(TRUNC(SYSDATE)),'DD-MM-YYYY')

TO_CHAR(TRUNC(SYSDATE))正在获得一个类似于以下内容的字符:&#39; 31-AUG-17&#39;,这不是在DD-MM-YYYY&#39;格式。 因此,TO_DATE(TRUNC(SYSDATE),'DD-MM-YYYY')得到这样的结果:29/09/0017,你的过滤器变为FALSE并且没有结果。