查询中的周计算

时间:2013-04-22 12:07:52

标签: oracle plsql date-arithmetic

使用oracle数据库和表格就像这样

id    sdate        offer
1   16-04-13       offer1
2   11-04-13       offer2
3   21-04-13       offer4
4   31-03-13       offer5
5   14-04-13       offer8
6   10-04-13       offer4
7   15-04-13       offer1

我想从sysdate计算周数为w1 w2,依此类推。 例如:

  • 代表id=1sdate属于16-04-13,因此为week1
  • 代表id=5sdate属于14-04-13,因此week2

结果应该是这样的

id  week   offer
1    w1   offer1
5    w2   offer8
.............

4 个答案:

答案 0 :(得分:1)

将今天和之前的六天视为“第1周”,然后将其作为“第2周”之前的七天,等等,尝试这样的事情:

SELECT
  id,
  'w' || TO_CHAR(TRUNC((TRUNC(SYSDATE) - sdate) / 7) + 1) as week,
  offer
FROM ... and so on

答案 1 :(得分:1)

你也有一个格式。 来自OTN

select to_char( date '2008-01-04', 'IW' ) from dual

答案 2 :(得分:0)

我认为您可以将功能TO_CHARDECODE结合起来,例如:

sql> select decode(to_char(sdate, 'W'),
                   '1', 'w1',
                   '2', 'w2',
                   '3', 'w3',
                   '4', 'w4',
                   '5', 'w5')
       from table1;

答案 3 :(得分:0)

一个日期减去另一个日期会给出它们的天数差异。除以七来得到几周的差异。使用floor()删除剩余部分。添加1因为你想从W1而不是W0开始。

select id
        , sdate
        , 'W'||trim(to_char(floor((sysdate - sdate)/7) + 1)) as wkno
from your_table
/

请注意,wkno表示为'W1','W2',...'W10',不会按数字排序。有各种各样的解决方法,比起选择者更明显,如果那是一个让你感到满意的东西。