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

Membandingkan Tanggal di Oracle SQL

31-DEC-95 bukan string, juga bukan 20-JUN-94 . Mereka angka dengan beberapa hal tambahan yang ditambahkan di akhir. Ini seharusnya '31-DEC-95' atau '20-JUN-94' - perhatikan kutipan tunggal, ' . Ini akan memungkinkan Anda untuk melakukan perbandingan string.

Namun, Anda tidak melakukan perbandingan string; Anda sedang melakukan perbandingan tanggal . Anda harus mengubah string Anda menjadi tanggal. Baik dengan menggunakan TO_DATE() . bawaan fungsi, atau literal tanggal.

TO_DATE()

select employee_id
  from employee
 where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

Metode ini memiliki beberapa jebakan yang tidak perlu

  • Seperti yang dicatat oleh a_horse_with_no_name dalam komentar, DEC , tidak selalu berarti Desember. Itu tergantung pada NLS_DATE_LANGUAGE Anda dan NLS_DATE_FORMAT pengaturan. Untuk memastikan bahwa perbandingan Anda dengan pekerjaan di lokal mana pun, Anda dapat menggunakan model format datetime MM sebagai gantinya
  • Tahun '95 tidak tepat. Anda tahu maksud Anda 1995, tetapi bagaimana jika itu tahun '50, apakah itu tahun 1950 atau 2050? Itu selalu yang terbaik untuk menjadi eksplisit
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

literal tanggal

Literal tanggal adalah bagian dari standar ANSI, yang berarti Anda tidak harus menggunakan fungsi khusus Oracle. Saat menggunakan literal Anda harus tentukan tanggal Anda dalam format YYYY-MM-DD dan Anda tidak dapat menyertakan elemen waktu.

select employee_id
  from employee
 where employee_date_hired > date '1995-12-31'

Ingat bahwa tipe data tanggal Oracle menyertakan elemen waktu, jadi tanggal tanpa porsi waktu sama dengan 1995-12-31 00:00:00 .

Jika Anda ingin memasukkan bagian waktu maka Anda harus menggunakan literal timestamp, yang mengambil format YYYY-MM-DD HH24:MI:SS[.FF0-9]

select employee_id
  from employee
 where employee_date_hired > timestamp '1995-12-31 12:31:02'

Informasi lebih lanjut

NLS_DATE_LANGUAGE berasal dari NLS_LANGUAGE dan NLS_DATE_FORMAT berasal dari NLS_TERRITORY . Ini disetel ketika Anda pertama kali membuat database tetapi mereka dapat diubah dengan mengubah file parameter inisialisasi Anda - hanya jika benar-benar diperlukan - atau pada tingkat sesi dengan menggunakan ALTER SESSION sintaksis. Misalnya:

alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';

Artinya:

  • DD hari numerik dalam sebulan, 1 - 31
  • MM bulan numerik dalam setahun, 01 - 12 ( Januari adalah 01 )
  • YYYY 4 digit tahun - menurut saya ini selalu lebih baik dari tahun 2 digit YY karena tidak ada kebingungan dengan abad apa yang Anda maksud.
  • HH24 jam dalam sehari, 0 - 23
  • MI menit setiap jam, 0 - 59
  • SS detik menit, 0-59

Anda dapat mengetahui bahasa Anda saat ini dan setelan bahasa tanggal dengan menanyakan V$NLS_PARAMETERSs dan keseluruhan nilai valid dengan menanyakan V$NLS_VALID_VALUES .

Bacaan lebih lanjut

  • Memformat model

Kebetulan, jika Anda ingin count(*) Anda perlu mengelompokkan berdasarkan employee_id

select employee_id, count(*)
  from employee
 where employee_date_hired > date '1995-12-31'
 group by employee_id

Ini memberi Anda hitungan per employee_id .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pencadangan basis data Oracle:Jenis pencadangan dan strategi pencadangan

  2. Oracle SQL:Memahami perilaku SYS_GUID() saat hadir dalam tampilan sebaris?

  3. PL/SQL ORA-01422:pengambilan yang tepat mengembalikan lebih dari jumlah baris yang diminta

  4. Bagaimana mengidentifikasi nilai yang tidak valid (rusak) yang disimpan di kolom TANGGAL Oracle

  5. AWS Python Lambda dengan Oracle