以下查询返回第 53 周,我认为 02-Jan-2017 是 2017 年第 1 周的开始。
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')
请告知我做错了什么。
正确,2017-01-02
在ISO第1周。但0017-01-02
是在 ISO 第 53 周:
TO_DATE('02-JAN-17', 'DD-MON-YYYY')
如果 Oracle 发出格式错误会更好,但好吧,数字 17 当然等于 0017 :-)
无论如何,在将字符串转换为日期时,您永远不应该依赖语言设置('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';