2010-02-17 72 views
1

我使用Oracle的TO_CHAR()函数将日期转换为周数(1-53):甲骨文周计算问题

select pat_id, 
    pat_enc_csn_id, 
    contact_date, 
    to_char(contact_date,'ww') week, 
    ... 

的“WW”开关让我对这些日期值的月份今年:

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功能,将计算周为我所期望的或者我需要写我自己?

编辑

我试图匹配水晶报表使用的逻辑。每个整周从星期日开始;一年中的第一周以1月1日为准(以2010年1月1日为周五)为准。

+0

“快速查看日历提示,这些值应该是”哪个日历?微软Outlook? – APC

回答

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 
+0

刚刚尝试过这一点,它会返回一周+ 1 –

0

我知道这是老了,但仍然是一个常见的问题。

这应该给你的努力量最小正确的结果:

select pat_id, 
pat_enc_csn_id, 
contact_date, 
to_char(contact_date + 1,'IW') week, 
...