最简单的是使用
/* Formatted on 2009/12/02 16:01 (Formatter Plus v4.8.8) */
SELECT TO_CHAR (TO_DATE ('2009-12-02', 'YYYY-MM-DD'), 'WW')
FROM DUAL;
不过to_char()函数在计算一年中第几周是从该年的1月1日开始的。
以下SQL 能得到正确的自然周数.
/* Formatted on 2009/12/02 15:31 (Formatter Plus v4.8.8) */
SELECT TO_CHAR
(DECODE
(SIGN
( ( TO_DATE ('2009-12-02', 'YYYY-MM-DD')
+ TO_NUMBER
(DECODE (TO_CHAR (TRUNC (TO_DATE ('2009-12-02',
'YYYY-MM-DD'
),
'YYYY'
),
'D'
),
'1', '8',
TO_CHAR (TRUNC (TO_DATE ('2009-12-02',
'YYYY-MM-DD'
),
'YYYY'
),
'D'
)
)
)
- 2
)
- LAST_DAY (TO_DATE ('2009-12-02', 'YYYY-MM-DD'))
),
1, LAST_DAY (TO_DATE ('2009-12-02', 'YYYY-MM-DD')),
( TO_DATE ('2009-12-02', 'YYYY-MM-DD')
+ TO_NUMBER (DECODE (TO_CHAR (TRUNC (TO_DATE ('2009-12-02',
'YYYY-MM-DD'
),
'YYYY'
),
'D'
),
'1', '8',
TO_CHAR (TRUNC (TO_DATE ('2009-12-02',
'YYYY-MM-DD'
),
'YYYY'
),
'D'
)
)
)
- 2
)
),
'WW'
)
FROM DUAL;

本文介绍了一种复杂的SQL查询方法,用于准确地计算指定日期对应的自然周数,即周一作为每周的第一天。通过使用DECODE和TO_CHAR等函数,此方法能够处理不同年份的日期,并确保结果符合自然周的定义。
839

被折叠的 条评论
为什么被折叠?



