只需使用:TO_CHAR( tbl.col, 'IW' )
您有多个问题:
数据类型为“日期”
您调用TO_DATE( string, format_model )
了DATE
(不是VARCHAR2
),这将导致甲骨文做的隐式转换DATE
到VARCHAR2
使用NLS_DATE_FORMAT
会话参数作为格式的模型,所以您可以将其转换回DATE
。因此,您实际上在做:
TO_CHAR(
TO_DATE(
TO_CHAR(
tbl.col,
( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' )
),
'YYYY/MM/DD'
),
'IW'
)
,只需使用:
TO_CHAR( tbl.col, 'IW' )
如果这样做,则以下问题无关紧要。
:
SELECT TO_CHAR( TO_DATE( '19-Jun-17', 'YYYY/MM/DD' ), 'YYYY-MM-DD' ) AS dt
FROM DUAL
:
DT
----------
0019-06-17
如果您不打算修复隐式字符串转换,那么您可能会想要:
TO_CHAR(TO_DATE(tbl.col,'DD-MON-YY'),'IW') AS week
或(取决于您希望99年是1999年还是2099年):
TO_CHAR(TO_DATE(tbl.col,'DD-MON-RR'),'IW') AS week