0
有人可以解释这种情况吗? 例子,我有数据转储表是这样的:SQL Oracle,得到不同的结果IN和BETWEEN
TGL
19810909
19761026
19832529
当我与此查询执行:
SELECT to_date(tgl,'YYYYMMDD') tgl
FROM
(
SELECT tgl
FROM tmpx
WHERE
SUBSTR(tgl,5,2) BETWEEN '01' AND '12'
AND length(tgl) = 8
)
WHERE to_date(tgl,'YYYYMMDD') < to_date('19811231','YYYYMMDD')
结果:没有错误
TGL
09/09/1981
26/10/1976
但是,当我执行与此查询:
SELECT to_date(tgl,'YYYYMMDD') tgl
FROM
(
SELECT tgl
FROM tmpx
WHERE
SUBSTR(tgl,5,2) IN ('01','02','03','04','05','06','07','08','09','10','01','12')
AND length(tgl) = 8
)
WHERE to_date(tgl,'YYYYMMDD') < to_date('19811231','YYYYMMDD')
结果:错误
ORA-01843: not a valid month
为什么行号第三(19832529),包括选择会导致一个错误? 而如果我执行以下查询:
SELECT tgl
FROM tmpx
WHERE
SUBSTR(tgl,5,2) IN ('01','02','03','04','05','06','07','08','09','10','11','12')
AND length(tgl) = 8
的结果是这样的(wihtout行号3)
TGL
19810909
19761026
谢谢。
fyi,转储表中的数据来自导入txt文件。这就是为什么第三行需要执行,其中'where子句'(WHERE to_date(tgl,'YYYYMMDD')
thesuhu
子查询应该首先得到结果2行 – thesuhu
@thesuhu - 但这取决于优化器的决定。您可以从SQL \ * Loader或外部表定义中调用'safe_to_date()'类型的函数。或者只是使用'between'版本,如果优化器选择不同,那么可能会有一天会中断。但实际上,如果您在该领域获取任何无效数据,则您不知道其他数据是否正确或错误,但发生验证。 –