おそらく問題は、考慮していない小数の日付コンポーネントがあることです。クエリの列を切り捨てることで、その小数の日付コンポーネントを無視できます:
SELECT section_id, COUNT(student_id) "ENROLLED"
FROM enrollment
WHERE TRUNC(enroll_date) = TO_DATE('2/10/2007', 'MM/DD/YYYY')
GROUP BY section_id
ORDER BY ENROLLED;
列enroll_date
を想定しています データ型はDATEです。
説明:Oracleは、ここ で説明されているように日付を保存します。 、「すでにDD-MON-YYになっている日付形式」と記載されているため、日付は保存されません。これは、日付が表示される形式のみであり、セッションのパラメーターNLS_DATE_FORMATによって決定されます。
テストテーブルを使って簡単なテストをしてみましょう。テーブルを作成し、セッションからNLS_DATE_FORMATを確認します。
create table DATE_TST
( id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
test_date DATE
);
INSERT INTO date_tst (test_date) VALUES (SYSDATE);
SELECT value
FROM nls_session_parameters
WHERE parameter = 'NLS_DATE_FORMAT';
DD-MON-YYYY
これが私の日付の表示方法です。
SELECT * FROM date_tst;
04-OCT-2020
だから私は今日の日付を持っています。涼しい。次に、その日付を使用してクエリを実行できるかどうかを確認します。
SELECT * FROM date_tst WHERE test_date = TO_DATE('04-OCT-2020','DD-MON-YYYY');
no rows.
日付を取得する日付形式に時間コンポーネントがないため、行は表示されません。 DATEには、年、月、日、時、分、秒があります。形式には、年、月、日のみがあります。データをクエリして、時間コンポーネントがあるかどうかを確認しましょう。
SELECT TO_CHAR(test_date,'DD-MON-YYYY HH24:MI:SS') FROM date_tst;
4-OCT-2020 21:12:39
ああ、そうです... SYSDATEは、秒までの現在の時刻です。次に、より正確な日付形式でそのクエリを再試行してみましょう。
SELECT * FROM date_tst WHERE test_date = TO_DATE('04-OCT-2020 21:12:39','DD-MON-YYYY HH24:MI:SS');
04-OCT-2020
そして、私たちの列があります。 TRUNCコマンドは、時間コンポーネントをカットします:
SELECT TO_CHAR(TRUNC(test_date),'DD-MON-YYYY HH24:MI:SS') FROM date_tst;
04-OCT-2020 00:00:00
したがって、クエリを簡略化できます:
SELECT * FROM date_tst WHERE TRUNC(test_date) = TO_DATE('04-OCT-2020','DD-MON-YYYY');
04-OCT-2020