[TL; DR] Chỉ cần sử dụng:TO_CHAR( tbl.col, 'IW' )
Bạn có nhiều vấn đề:
-
Bạn đang gọi
TO_DATE( string, format_model )
vớiDATE
(không phảiVARCHAR2
) khiến Oracle thực hiện chuyển đổi ngầm định đối vớiDATE
thànhVARCHAR2
sử dụngNLS_DATE_FORMAT
tham số phiên làm mô hình định dạng để bạn có thể chuyển đổi nó trở lạiDATE
. Vì vậy, bạn đang làm một cách hiệu quả:TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )
Không làm điều này , chỉ cần sử dụng:
TO_CHAR( tbl.col, 'IW' )
Nếu bạn làm điều đó thì các vấn đề sau không liên quan.
- Như RealCheeseLord đã chỉ ra, vị trí của năm và ngày trong mô hình định dạng của bạn bị đảo ngược; và
-
Bạn đang sử dụng
YYYY
cho mô hình định dạng năm để tất cả các năm sẽ ở vào thế kỷ thứ nhất sau Công nguyên.Ví dụ :
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt FROM DUAL
Đầu ra :
DT ---------- 0019-06-17
Nếu bạn không sửa chuyển đổi chuỗi ngầm định thì bạn có thể muốn:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
hoặc (tùy thuộc vào việc bạn muốn năm 99 là 1999 hay 2099):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week
-
Bạn đang sử dụng
MM
mô hình định dạng choMON
dữ liệu được định dạng - đây không nhất thiết là vấn đề vìMM
cũng khớp vớiMON
vàMONTH
nhưng bạn có thể nên sử dụng đúng mô hình.