我一直在使用以下语句从日期中获取一年中的第几周:
TO_CHAR(TO_DATE(tbl.col,'YYYY/MM/DD'),'IW') AS week
现在我收到奇怪的结果,我似乎无法弄清楚。对于以下日期,我将收到第24周的信息:
17年6月19日|| 17年6月23日|| 2015年6月24日|| 2015年6月25日|| 17年6月29日|| 17年6月30日
为此,我收到25:
17年6月20日|| 17年6月21日|| 17年6月22日|| 17年6月26日|| 17年6月27日|| 17年6月28日
…而且这种情况还在继续。现在我所有的查询都显示不正确的数据,我有点担心。我直到现在才注意到的唯一原因是因为第26、27、30、31和32周没有结果,而我的其他任何查询都不是这种情况。
任何建议或指向可能的错误的指针,不胜感激。
谢谢!
[TL; DR] 只需使用:TO_CHAR( tbl.col, 'IW' )
TO_CHAR( tbl.col, 'IW' )
您有多个问题:
数据类型为“日期”
您调用TO_DATE( string, format_model )了DATE(不是VARCHAR2),这将导致甲骨文做的隐式转换DATE到VARCHAR2使用NLS_DATE_FORMAT会话参数作为格式的模型,所以您可以将其转换回DATE。因此,您实际上在做:
TO_DATE( string, format_model )
DATE
VARCHAR2
NLS_DATE_FORMAT
TO_CHAR( TO_DATE( TO_CHAR( tbl.col, ( SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_DATE_FORMAT' ) ), 'YYYY/MM/DD' ), 'IW' )
不要这样做 ,只需使用:
如果这样做,则以下问题无关紧要。
YYYY
范例 :
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
MM
MON
MON``MONTH