Saya mencoba membuatnya menampilkan jumlah karyawan yang dipekerjakan setelah 20 Juni 1994, Tapi saya mendapatkan kesalahan mengatakan "pengidentifikasi tidak valid JUN. Tolong bantu, terima kasih!
Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95;
> <
atauBETWEEN '' AND ''
Jawaban:
31-DEC-95
bukan string, juga bukan20-JUN-94
. Mereka angka dengan beberapa hal tambahan yang ditambahkan pada akhirnya. Ini harus'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()
fungsi bawaan, atau literal tanggal .SAAT INI()
Metode ini memiliki beberapa jebakan yang tidak perlu
DEC
tidak harus berarti Desember. Itu tergantung pada pengaturanNLS_DATE_LANGUAGE
dan AndaNLS_DATE_FORMAT
. Untuk memastikan bahwa perbandingan Anda dengan pekerjaan di lokal saja Anda dapat menggunakan format model datetimeMM
bukanLiteral tanggal
Literal tanggal adalah bagian dari standar ANSI, yang berarti Anda tidak harus menggunakan fungsi spesifik Oracle. Saat menggunakan literal Anda harus menentukan tanggal Anda dalam format
YYYY-MM-DD
dan Anda tidak dapat memasukkan elemen waktu.Ingat bahwa datatype tanggal Oracle menyertakan elemement waktu, sehingga tanggal tanpa porsi waktu sama dengan
1995-12-31 00:00:00
.Jika Anda ingin memasukkan bagian waktu maka Anda harus menggunakan timestamp literal, yang mengambil format
YYYY-MM-DD HH24:MI:SS[.FF0-9]
Informasi lebih lanjut
NLS_DATE_LANGUAGE
berasal dariNLS_LANGUAGE
danNLS_DATE_FORMAT
berasal dariNLS_TERRITORY
. Ini diatur ketika Anda awalnya membuat database tetapi mereka dapat diubah dengan mengubah file parameter inisialisasi Anda - hanya jika benar-benar diperlukan - atau pada tingkat sesi dengan menggunakanALTER SESSION
sintaks. Misalnya:Ini berarti:
DD
hari numerik bulan itu, 1 - 31MM
bulan numerik tahun ini, 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 sehari, 0-23MI
menit, 0 - 59SS
menit kedua, 0-59Anda dapat mengetahui pengaturan bahasa tanggal dan bahasa saat ini dengan kueri
V$NLS_PARAMETERSs
dan keseluruhan penuh nilai yang valid dengan kueriV$NLS_VALID_VALUES
.Bacaan lebih lanjut
Kebetulan, jika Anda ingin,
count(*)
Anda perlu mengelompokkan berdasarkanemployee_id
Ini memberi Anda hitungan per
employee_id
.sumber
DEC
tidak selalu selalu bulan yang valid. Biasanya lebih baik menggunakan angka daripada namatimestamp
literal alih-alihdate
literal:timestamp '2015-01-30 19:42:04'
(karena dalam ANSI SQLdate
tipe data tidak punya waktu, hanyatimestamp
tipe data yang melakukannya).DATE 2016-04-01
sarana yang2016-04-01 00:00:00
sesungguhnya. Dan saya pikir sintaks ini bekerja sejak Oracle 9i karena di sinilah sintaks ANSI-SQL diperkenalkan ke Oracle.define
adalah perintah SQL * Plus yang menggantikan apa pun yang telah Anda tetapkan ke semua variabel substitusi dengan nama itu .ALTER SESSION
adalah pernyataan yang memungkinkan Anda untuk memodifikasi beberapa parameter basis data atau pengaturan selama sesi ituKesimpulan,
to_char
bekerja dengan caranya sendiriBegitu,
Selalu gunakan format ini YYYY-MM-DD untuk perbandingan, bukan MM-DD-YY atau DD-MM-YYYY atau format lainnya
sumber
Anda dapat menggunakan trunc dan to_date sebagai berikut:
sumber
dari kueri Anda:
Saya pikir itu tidak untuk menampilkan jumlah karyawan yang dipekerjakan setelah 20 Juni 1994. jika Anda ingin menunjukkan jumlah karyawan, Anda dapat menggunakan:
Saya pikir praktik terbaik untuk membandingkan tanggal yang dapat Anda gunakan:
sumber
Kutipan tunggal harus ada di sana, sejak tanggal dikonversi ke karakter.
sumber