2017-01-02 27 views
0

以下查询返回第0周。 53,我认为02-Jan-2017是2017年第一周的开始。Oracle 10g星期编号

SELECT TRUNC(CL_DT, 'IW') AS WK_STARTDATE, 
     TRUNC(CL_DT, 'IW') + 6 AS WK_ENDDATE, 
     TO_CHAR(TO_DATE('02-JAN-17', 'DD-MON-YYYY'), 'IW') AS WK_WEEKNO, 
     CL_DT, 
     TO_DATE(SYSDATE, 'DD-MON-YY') 
    FROM PM_CALENDAR 
WHERE CL_DT = TO_DATE('02-JAN-17', 'DD-MON-YY') 

请指教我做错了什么。

回答

5

正确,2017-01-02是ISO星期1。但0017-01-02是ISO53周:

TO_DATE('02-JAN-17', 'DD-MON-YYYY') 

这本来是更好的,有甲骨文发布了格式错误,但远,17号等于0017 course :-)

将字符串转换为日期时,不应该依赖语言设置('JAN'当然不是您可以设置的每种语言的有效月份)。您可以在此为TO_CHAR指定一个参数。而TO_DATE(SYSDATE, 'DD-MON-YY')真是太可怕了。在这里,您甚至可以根据系统/会话中的默认格式将SYSDATE隐式转换为字符串,然后您将其视为'DD-MON-YY'并将其转换回来。

更好地使用ISO日期文字代替(即不处理字符串和转换在所有的工作):

date'2017-01-02' 

以下是更正后的查询:

SELECT TRUNC(CL_DT, 'IW') AS WK_STARTDATE, 
     TRUNC(CL_DT, 'IW') + 6 AS WK_ENDDATE, 
     TO_CHAR(DATE '2017-01-02', 'IW') AS WK_WEEKNO, 
     CL_DT 
    FROM PM_CALENDAR 
WHERE CL_DT = DATE '2017-01-02'; 
+0

感谢您的宝贵意见,并就解决了我的问题 – Nasir