1

クエリを実行しているテーブルには、日付が varchar2 として保存されています。varchar2 として格納されている日付を sysdate を使用して比較する必要がありますBETWEEN sysdate-1 AND sysdate-30(先月の varchar2 日付を返すため)。

指定するTO_DATE(varchar2, 'DD-MON-YYYY')と、「リテラルがフォーマット文字列と一致しません」というエラーが表示されます。

TO_DATE()Oracle のドキュメントによると、これはvarchar2 から変換する場合に許容される形式であると書かれているため、行き詰まっています。

更新:これは企業データベースです。私はDBを設計しておらず、私が利用できるものでしか動作しません。データセットは膨大で、毎日 10,000 台以上の SCADA デバイスによって自動的に更新されます。

SELECT device_name, read_date, sysdate

FROM oracle_database

------- Data Returned by query --------

device_name read_date   sysdate
Device 1    5/14/2013   22-Sep-14
Device 2    5/14/2013   22-Sep-14
Device 3    5/14/2013   22-Sep-14
Device 4    5/14/2013   22-Sep-14
Device 5    5/14/2013   22-Sep-14
Device 6    5/14/2013   22-Sep-14
Device 7    5/14/2013   22-Sep-14

TO_DATE を使用した結果

SELECT device_name, TO_DATE(read_date, 'DD-MON-YY'), sysdate

------- クエリによって返されるデータ ----------

ORA-01861: リテラルがフォーマット文字列と一致しません

4

3 に答える 3

1
SELECT device_name, TO_DATE(read_date, 'DD/MM/YYYY'), sysdate
于 2016-02-14T13:59:35.320 に答える
0

まず、設計に欠陥があります。データ型DATEとしては決して使用しないでください。VARCHAR2

第 2 に、日付を比較して adate literalを aに変換するときはDATE、常に両側で同じ書式マスクを指定します。

文字列を日付に変換するにはTO_DATE、適切なフォーマット マスクと共に使用します。

日付を文字列に変換するにはTO_CHAR、同じ書式マスクを使用します。

式の値を比較するときは、explicitlyの両側のデータ型を変換してcomparison operatorを避けるようにしてくださいimplicit data type conversion

また、Ed Stevens によるこの優れた記事を読む必要があります

于 2014-09-22T16:11:59.740 に答える