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 padaNLS_DATE_LANGUAGE
Anda danNLS_DATE_FORMAT
pengaturan. Untuk memastikan bahwa perbandingan Anda dengan pekerjaan di lokal mana pun, Anda dapat menggunakan model format datetimeMM
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 - 31MM
bulan numerik dalam setahun, 01 - 12 ( Januari adalah 01 )YYYY
4 digit tahun - menurut saya ini selalu lebih baik dari tahun 2 digitYY
karena tidak ada kebingungan dengan abad apa yang Anda maksud.HH24
jam dalam sehari, 0 - 23MI
menit setiap jam, 0 - 59SS
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
.