我正在使用Oracle的to_char()函数将日期转换为周数(1-53):
select pat_id,
pat_enc_csn_id,
contact_date,
to_char(contact_date,'ww') week,
...
Date Week
1-Jan-10 1
2-Jan-10 1
3-Jan-10 1
4-Jan-10 1
5-Jan-10 1
6-Jan-10 1
7-Jan-10 1
8-Jan-10 2
9-Jan-10 2
10-Jan-10 2
11-Jan-10 2
12-Jan-10 2
快速查看日历表明这些值应为:
Date Week
1-Jan-10 1
2-Jan-10 1
3-Jan-10 2
4-Jan-10 2
5-Jan-10 2
6-Jan-10 2
7-Jan-10 2
8-Jan-10 2
9-Jan-10 2
10-Jan-10 3
11-Jan-10 3
12-Jan-10 3
如果我使用'iw'开关而不是'ww',结果就不太可取了:
Date Week
1-Jan-10 53
2-Jan-10 53
3-Jan-10 53
4-Jan-10 1
5-Jan-10 1
6-Jan-10 1
7-Jan-10 1
8-Jan-10 1
9-Jan-10 1
10-Jan-10 1
11-Jan-10 2
12-Jan-10 2
是否有另一个Oracle函数可以按照我的预期计算周数,或者我需要编写自己的函数吗?
修改
我正在尝试匹配Crystal Reports使用的逻辑。每个星期从星期日开始;一年中的第一周从1月1日开始的任何一天开始(例如在2010年,1月1日是星期五)。
答案 0 :(得分:1)
使用IW时,Oracle遵循ISO 8601标准关于周数(参见http://en.wikipedia.org/wiki/ISO_8601)。这与我们在欧洲通常使用的标准相同。
Oracle论坛上也提到了您的问题:http://forums.oracle.com/forums/thread.jspa?threadID=947291和http://forums.oracle.com/forums/message.jspa?messageID=3318715#3318715。也许你可以在那里找到解决方案。
答案 1 :(得分:0)
由于您似乎正在使用您的自己对周数的特殊定义,因此您需要编写自己的函数。
NLS_TERRITORY影响D格式模型使用的一周开始的日期可能会有所帮助
另见:
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements004.htm#SQLRF00210
和
答案 2 :(得分:0)
基于这个问题How do I calculate the week number given a date?,我编写了以下Oracle逻辑:
CASE
--if [date field]'s day-of-week (e.g. Monday) is earlier than 1/1/YYYY's day-of-week
WHEN to_char(to_date('01/01/' || to_char([date field],'YYYY'),'mm/dd/yyyy'), 'D') - to_char([date field], 'D') > 1 THEN
--adjust the week
trunc(to_char([date field], 'DDD') / 7) + 1 + 1 --'+ 1 + 1' used for clarity
ELSE trunc(to_char([date field], 'DDD') / 7) + 1
END calendar_week
答案 3 :(得分:0)
我知道这是旧的,但仍然是一个常见的问题。
这应该以最小的努力给你正确的结果:
select pat_id,
pat_enc_csn_id,
contact_date,
to_char(contact_date + 1,'IW') week,
...