在以下情况下,企业希望基于给定的开始日期到结束日期来计算周数。
例如:开始日期= 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天等。如何计算?感谢您的帮助!
答案 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将自动每月正确处理不同的天数。 此请求的两种方法:
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;
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天,可能会在指定的结束日期之后结束。