0

次のSQLに取り組んでおり、日付部分でエラーが発生し続けています

私が得ているエラーは次のとおりです:- ORA-01861: リテラルがフォーマット文字列と一致しません

  SELECT COUNT(*) 
  FROM  STGDBA.INTERACTIONS
  WHERE APP_ID='Home Depot'
  AND PEGA_ID ='0'
  AND TO_CHAR(to_date(END_TIME))BETWEEN TO_DATE('2012-AUG-01', 'YYYY-MON-DD')AND TO_DATE
('2012-AUG-31', 'YYYY-MON-DD')

これは、日付がデータベースに保存される方法です:- 2011-10-24 08:46:31.621

4

1 に答える 1

2

VARCHAR2まず、データ型を使用してテーブルに日付またはタイムスタンプ データを格納しないでください。常に適切なデータ型 ( datetimestamptimestamp with time zoneなど) を使用する必要があります。間違ったデータ型でデータを格納すると、パフォーマンスの問題 (オプティマイザのカーディナリティの推定は一般に正確性が大幅に低下し、列のインデックス作成がさらに問題になります) につながるだけでなく、一部のアプリケーションが誤って文字列をテーブルの形式が間違っていると、さまざまなクエリがエラーをスローし始めたり、実行計画の微妙な変更によってエラーが突然発生したり (または停止したり) したりすることがあります。

end_time次に、テーブルのすべての行のすべての文字列が (他の 2 つの述語が満たされているかどうかにかかわらず) 次の形式であると仮定します。YYYY-MM-DD HH24:MI:SS.FFF

SELECT COUNT(*) 
  FROM  STGDBA.INTERACTIONS
  WHERE APP_ID='Home Depot'
  AND PEGA_ID ='0'
  AND to_date(substr(END_TIME,1,length(end_time)-4), 
              'YYYY-MM-DD HH24:MI:SS' ) BETWEEN TO_DATE('2012-AUG-01', 'YYYY-MON-DD')
                                            AND TO_DATE('2012-AUG-31', 'YYYY-MON-DD')

日付を日付に、文字列を文字列に常に比較する必要があるため、式の左側をto_char. を呼び出すときは常に、明示的な書式マスクを指定する必要がto_dateあります。これは、私がここで行っていることです。また、 a にdateはサブ秒の精度がないため、小数秒を削除する必要があります ( a と宣言end_timeした場合、これは問題になりませんtimestamp(3))。

于 2013-01-25T21:22:32.270 に答える