誰かがこのケースを説明できますか? 例、私はこのようなデータをダンプテーブルを持っている: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
結果は(行番号3 wihtout)このようなものです
TGL
19810909
19761026
はあなたに感謝を。
fyi、ダンプテーブルのデータはインポートtxtファイルからのものです。 (where toddate(tgl、 'YYYYMMDD')
thesuhu
サブクエリは、最初に結果2行を取得する必要があります – thesuhu
@thesuhu - しかし、それは決定する最適化するまでです。 SQL \ * Loaderまたは外部テーブル定義から 'safe_to_date()'型関数を呼び出すことができます。あるいは、オプティマイザが別の方法で選択した場合、1日で中断する可能性のある 'between'バージョンを使用してください。しかし、実際に、そのフィールドに無効なデータがある場合、他のデータが正しいか間違っているのかは分かりませんが、検証が行われます。 –