Oracle 10g周数

时间:2017-01-02 11:49:38

标签: database oracle oracle10g

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

请告知我的错误。

1 个答案:

答案 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';