2

2 つの日付の間のテーブルからデータを取得する SQL クエリを作成しています。示されているように、2 つの入力を与えます。Date を変換しTO_CHAR(DD/MON/YYYY)ます。

 1. StartDate > 01/SEP/2009 
    EndDate < 01/OCT/2009

 2. StartDate > 01/SEP/2009
    EndDate < 1/OCT/2009

最初の入力で結果が得られません。2番目に変更すると、結果が得られます。01/OCT/2009 と 1/OCT/2009 の違いは何ですか?

4

2 に答える 2

3

日付を比較するときは、常に演算子の両側を明示的にDATEデータ型に変換する必要があります。StartDateとEndDateが両方ともDATEデータ型であると仮定すると、これは機能します。

 StartDate > to_date('01/SEP/2009', 'dd/MON/yyyy')
 AND EndDate < to_date('01/OCT/2009', 'dd/MON/yyyy')

ただし、あなたの場合、得られる結果はVARCHAR比較と一致しています。文字列を比較しているのですが、正しい結果が得られる可能性はほとんどありません(たとえば、月はアルファベット順に並べ替えられていないため)。

StartDateとEndDateが実際にVARCHARである場合は、それらを明示的に変換する必要があります。

 to_date(StartDate, 'dd/MON/yyyy') > to_date('01/SEP/2009', 'dd/MON/yyyy')
 AND to_date(EndDate, 'dd/MON/yyyy') < to_date('01/OCT/2009', 'dd/MON/yyyy')

これは、Oracleのすべてのバージョンに有効です。

于 2009-09-11T08:37:57.627 に答える
0

回答を確認できる Oracle クライアントがないため、定かではありませんが、Oracle では、曜日を表す日付文字列の 1 桁 (D) を使用して、曜日 (月曜日から日曜日) を指定します。一方、2 桁は月の日を指定するために使用されます (3 桁は年の日付を表します)。解釈を行う正しい方法と思われるものを使用して文字列を変換していると述べましたが、これが問題の原因である可能性があると思います(または、少なくとも違いの説明になる可能性があります..)。

于 2009-09-11T08:06:14.330 に答える