以下查询返回第n周。 53,我认为2017年1月2日是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')
请告知我的错误。
答案 0 :(得分:6)
正确,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';