根据初始给定日期至结束日期计算周数

时间:2020-04-23 00:49:51

标签: sql oracle plsql

在以下情况下,企业希望基于给定的开始日期到结束日期来计算周数。

例如:开始日期= 2020年8月24日结束日期= 2020年12月31日(这些开始日期和结束日期不是恒定的,它们可能会逐年更改)

下面的预期输出:

[Date 1      Date 2       Week Number
8/24/2020    8/30/2020    week1
8/31/2020    9/6/2020     week2
9/7/2020     9/14/2020    week3
9/15/2020    9/21/2020    week4
9/22/2020    9/28/2020    week5
9/29/2020    10/5/2020    week6
10/6/2020    10/12/2020   week7
10/13/2020   10/19/2020   week8
10/20/2020   10/26/2020   week9
10/27/2020   11/02/2020   week10
11/03/2020   11/09/2020   week11
11/10/2020   11/16/2020   week12
11/17/2020   11/23/2020   week13
11/24/2020   11/30/2020   week14

我需要Oracle Query来计算上述的周数..基于7天的开始日期,然后将计算周数。.但是请记住,某个月的跨月有30天,而某月有31天等。如何计算?感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果您的日期数据类型为varchar,请先将其转换为日期,然后再将其转换回varchar

convert date to to_char(to_date('8/24/2020','MM/DD/YYYY'),'WW')

如果将周数据类型保留为number,则可以执行以下操作

to_number(to_char(to_date('8/24/2020','MM/DD/YYYY'),'WW'))

很少有您需要的选项。

WW  Week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year.
W   Week of month (1-5) where week 1 starts on the first day of the month and ends on the seventh.
IW  Week of year (1-52 or 1-53) based on the ISO standard.

答案 1 :(得分:0)

似乎是您在寻找自定义星期定义而不是内置函数。但不是太困难。第一件事是将字符串转换为日期(如果实际上不需要从表中删除列,则不需要此转换),然后让Oracle执行所有计算,因为您可以对日期应用算术运算,但不添加两个日期。 Oracle将自动每月正确处理不同的天数。 此请求的两种方法:

  1. 使用递归CTE(带有)
with dates(start_date,end_date) as 
     ( select date '2020-08-24' start_date
            , date '2020-12-31' end_date 
         from dual
     )
   , weeks (wk, wk_start, wk_end, e_date) as
     ( select 1, start_date, start_date+6 ld, end_date from dates
       union all 
       select wk+1, wk_end+1, wk_end+7, e_date
         from weeks 
        where wk_end<e_date
     )
select wk, wk_start, wk_end from weeks;
  1. 使用Oracle连接依据
with dates(start_date,end_date) as 
     ( select date '2020-08-24' start_date
            , date '2020-12-31' end_date 
         from dual
     )
 select level wk
      , start_date+7*(level-1) wk_start
      , start_date+6+7*(level-1)
   from dates
 connect by level <= ceil( (end_date-start_date)/7.0);

根据您对指定的结束日期的严格程度,可能需要调整返回的最后一行。这两个查询都不对此进行调整。他们只是确保在该日期之后没有一周开始。但是最后一周包含整整7天,可能会在指定的结束日期之后结束。