【问题标题】:Set first week of the year from the first day of the year until the following monday设置一年的第一周从一年的第一天到下一个星期一
【发布时间】:2014-12-03 17:22:21
【问题描述】:

我希望 Oracle 按以下方式处理几周:

-本周从星期一开始
- 一年的第一周是从一年的第一天到下一个星期一

所以 2015 年会是

2015 年 1 月 1 日(星期四)将是 1
2015 年 1 月 2 日(星期五)将是 1
2015 年 1 月 3 日(星期六)将是 1
2015 年 1 月 4 日(星期日)将是 1
2015 年 1 月 5 日(星期一)将是 2
2015 年 1 月 6 日(星期二)将是 2

2017 年将是

2017 年 1 月 1 日(星期日)将是 1
2017 年 1 月 2 日(星期一)将是 2
2017 年 1 月 3 日(星期二)将是 2
2017 年 1 月 4 日(星期三)将是 2

等等……

我需要年份的数字,所以会转到 1 到 53-54

【问题讨论】:

  • 你可以用日期算术来做到这一点,但我宁愿使用日历表。
  • 您需要部分第一周吗?或者它可能包含前一年的最后几天?即:第 1 周是从 2014 年 1 月 1 日到 2014 年 1 月 5 日从 2013 年 12 月 30 日到 2014 年 1 月 5 日?
  • 只要满足我提到的两个条件,就不管它是否包含上一年的日子

标签: sql oracle date


【解决方案1】:

一点点算术可能就可以解决问题(假设d 是您的日期):

select TRUNC((case to_char(d, 'DY')
          when 'MON' then 6
          when 'TUE' then 5
          when 'WED' then 4
          when 'THU' then 3
          when 'FRI' then 2
          when 'SAT' then 1
          when 'SUN' then 0
       end + to_number(to_char(d, 'DDD'))-1) / 7)+1
from v;
  • case 语句将根据星期几建立偏移量
  • 接下来我添加一年中的哪一天
  • 然后我将结果除以 7 作为周数(从 0 开始)
  • 最后,+1 将从 1 开始计算周数

请花点时间尝试一下http://sqlfiddle.com/#!4/d41d8/38236,以检查我是否犯了愚蠢的错误,因为我没有时间仔细测试它。对不起……

【讨论】:

    【解决方案2】:

    使用 ISO 星期日期标准:'iw'。

    2014-01-01 实际上是星期三,所以:

    select
      to_number(to_char(date'2014-01-05', 'iw')) as weeknum, 
      to_char(date'2014-01-05', 'Day') as day
    from dual;
    
        WEEKNUM DAY
    ----------- ---------
              1 Sunday
    
    select
      to_number(to_char(date'2014-01-06', 'iw')) as weeknum,
      to_char(date'2014-01-06', 'Day') as day
    from dual;
    
        WEEKNUM DAY
    ----------- ---------
              2 Monday
    

    【讨论】:

    • 我查询 2-jan-2017 是星期一,会给我作为 weeknum 1 所以不好,结果我想要一个 2
    猜你喜欢
    • 2016-11-29
    • 2014-05-15
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多