[TL;DR] Cukup gunakan:TO_CHAR( tbl.col, 'IW' )
Anda memiliki banyak masalah:
-
Anda memanggil
TO_DATE( string, format_model )
denganDATE
(bukanVARCHAR2
) yang menyebabkan Oracle melakukan konversi implisit dariDATE
keVARCHAR2
menggunakanNLS_DATE_FORMAT
parameter sesi sebagai model format agar Anda dapat mengubahnya kembali menjadiDATE
. Jadi, Anda secara efektif melakukan:TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )
Jangan lakukan ini , cukup gunakan:
TO_CHAR( tbl.col, 'IW' )
Jika Anda melakukannya, maka masalah berikut tidak relevan.
- Seperti yang ditunjukkan oleh RealCheeseLord, posisi tahun dan hari dalam model format Anda terbalik; dan
-
Anda menggunakan
YYYY
untuk model format tahun sehingga semua tahun akan berada di abad ke-1 Masehi.Contoh :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL
Keluaran :
DT ---------- 0019-06-17
Jika Anda tidak akan memperbaiki konversi string implisit maka Anda mungkin ingin:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
atau (tergantung apakah Anda ingin tahun 99 menjadi 1999 atau 2099):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
-
Anda menggunakan
MM
model format untukMON
data yang diformat - ini tidak selalu menjadi masalah karenaMM
juga cocok denganMON
danMONTH
tetapi Anda mungkin harus menggunakan model yang benar.