2

データベース「01-APR-12」にこの形式の日付があり、列はDATE型です。

私のSQL文は次のようになります。

SELECT DISTINCT c.customerno, c.lname, c.fname
FROM customer c, sales s
WHERE c.customerno = s.customerno AND s.salestype = 1 
AND (s.salesdate BETWEEN '01-APR-12' AND '31-APR-12');

そのようにしようとすると、次のエラーが発生します -- ORA-01839: 指定された月に対して日付が無効です。

データベースで日付を設定する方法で BETWEEN キーワードを使用することはできますか?

そうでない場合、データベース内のデータを修正することなく、その日付範囲内のデータの出力を取得できる別の方法はありますか?

ありがとう!

4

3 に答える 3

5

4月は31日ではなく30日です。

変化する

SELECT DISTINCT c.customerno, c.lname, c.fname
FROM customer c, sales s
WHERE c.customerno = s.customerno AND s.salestype = 1 
AND (s.salesdate BETWEEN '01-APR-12' AND '31-APR-12');

SELECT DISTINCT c.customerno, c.lname, c.fname
FROM customer c, sales s
WHERE c.customerno = s.customerno AND s.salestype = 1 
AND (s.salesdate BETWEEN '01-APR-12' AND '30-APR-12');

そして、あなたは行く準備ができているはずです。

于 2012-05-14T00:51:57.410 に答える
1

チェックしている日付が月の 1 日から月末までの範囲である場合、月の最終日を明示的にチェックする必要がある場合を避けるために、クエリを変更できます。


SELECT DISTINCT c.customerno, c.lname, c.fname
  FROM customer c, sales s
 WHERE c.customerno = s.customerno
   AND s.salestype = 1 AND (s.salesdate BETWEEN '01-APR-12' AND LAST_DAY(TO_DATE('APR-12', 'MON-YY'));

LAST_DAY 関数は、月の最終日を提供します。

于 2012-05-14T09:46:32.973 に答える
0

他の回答は重要なことを見逃しており、正しい結果を返しません。日付には日付と時刻のコンポーネントがあります。salesdate 列が実際に時間を含む日付である場合、4 月 30 日に発生した販売は、真夜中に発生しない限り、見逃してしまいます。

次に例を示します。

create table date_temp  (temp date);
insert into date_temp values(to_date('01-APR-2014 15:12:00', 'DD-MON-YYYY HH24:MI:SS'));
insert into date_temp values(to_date('30-APR-2014 15:12:00', 'DD-MON-YYYY HH24:MI:SS'));

テーブル DATE_TEMP が作成されました。

1 行挿入されました。

1 行挿入されました。

select * from date_temp where temp between '01-APR-2014' and '30-APR-2014';

クエリ結果: 01-APR-14

日付フィールドに時間コンポーネントを含むすべてのレコードを 4 月から取得する場合は、次の月の最初の日を between 句の 2 番目の側として使用する必要があります。

select * from date_temp where temp between '01-APR-2014' and '01-MAY-2014';

2014 年 4 月 1 日

2014 年 4 月 30 日

于 2015-02-02T22:21:15.057 に答える