Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

TO_DATE saya sepertinya tidak berfungsi dengan baik

Kemungkinan besar masalahnya adalah ada komponen tanggal pecahan yang tidak Anda perhitungkan. Anda dapat mengabaikan komponen tanggal pecahan itu dengan memotong kolom dalam kueri Anda:

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;

Saya berasumsi bahwa kolom enroll_date bertipe data DATE.

Beberapa penjelasan:Oracle menyimpan tanggal seperti yang dijelaskan di sini , itu TIDAK menyimpan tanggal saat Anda menyatakan "Format tanggalnya sudah DD-MON-YY.". Itu hanya format tanggal yang Anda lihat, yang ditentukan oleh parameter NLS_DATE_FORMAT untuk sesi Anda.

Mari kita lakukan tes cepat dengan tabel tes. Buat tabel dan periksa NLS_DATE_FORMAT dari sesi saya.

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

Beginilah cara saya melihat teman kencan saya.


SELECT * FROM date_tst;

04-OCT-2020

Jadi saya punya tanggal hari ini. Dingin. Sekarang mari kita lihat apakah saya dapat melakukan kueri menggunakan tanggal tersebut:


SELECT * FROM date_tst WHERE test_date = TO_DATE('04-OCT-2020','DD-MON-YYYY');

no rows.

Tidak ada baris yang ditampilkan karena format tanggal saya mendapatkan tanggal saya tidak memiliki komponen waktu. DATE memiliki Tahun, bulan, hari, jam, menit dan detik. Formatnya hanya memiliki tahun, bulan dan hari. Mari kita query data untuk memeriksa apakah ada komponen waktu.

SELECT TO_CHAR(test_date,'DD-MON-YYYY HH24:MI:SS') FROM date_tst;

4-OCT-2020 21:12:39

Ah itu dia... SYSDATE adalah waktu saat ini hingga detik. Sekarang mari kita coba kueri itu lagi dengan format tanggal yang lebih tepat:

SELECT * FROM date_tst WHERE test_date = TO_DATE('04-OCT-2020 21:12:39','DD-MON-YYYY HH24:MI:SS');

04-OCT-2020

Dan di sanalah barisan kami. Perintah TRUNC akan memotong komponen waktu:

SELECT TO_CHAR(TRUNC(test_date),'DD-MON-YYYY HH24:MI:SS') FROM date_tst;

04-OCT-2020 00:00:00

Jadi Anda dapat menyederhanakan kueri Anda:

SELECT * FROM date_tst WHERE TRUNC(test_date) = TO_DATE('04-OCT-2020','DD-MON-YYYY');

04-OCT-2020


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbarui dengan pemicu setelah memasukkan pada tabel yang sama

  2. PL SQL cara memilih semua kolom

  3. Performa lambat untuk subquery factoring (CTE) bersarang dalam

  4. Masalah Kendala Kunci Asing di Oracle

  5. Memasukkan ke Oracle Nested Table di Java