甲骨文 10g 周数



以下查询返回第 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';

最新更新