在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');
(这是我在分区维护脚本中遇到的问题的一个非常简化的示例,并且在上周无法解决)。 提前感谢您提供与上述查询相关的任何帮助。
答案 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并且没有结果。