SQL脚本显示每月的当前周和第一周

时间:2019-06-07 20:12:59

标签: sql oracle11g

我已经编写了sql代码来提取我需要的所有数据,但开始日期是几周。我需要查看当前一周,然后查看未来的日期,每个月的第一天。 (就像我说的那样,这些时间是几周,日期是每个星期一。(例如19年6月3日,19年6月10日,19年6月17日...。)

select 
d.ITEM,
i.DESCRIPTION,
d.MARKET,
(CASE
WHEN d.LOC like 'U%' THEN 'US'
WHEN d.LOC like 'M%' THEN 'MX'
WHEN d.LOC like 'C%' THEN 'CA'
ELSE 'EXP' END) as COUNTRY,
d.START_DATE as STARTDATE,
SUM(d.DEMANDQTY) as QTY

from DEMAND d, ITEM i
where d.ITEM = i.ITEM 
GROUP BY d.ITEM, i.DESCRIPTION, d.MARKET, d.LOC,d.START_DATE

因此,如果我今天(19年6月7日)提取此数据,则只需要提取... 03-JUN-19、01-JUL-19、05-AUG-19、02-SEP的日期-19、07-OCT-19、04-NOV-19、02-DEC-19、06-JAN-20等等,直到数据完成。

1 个答案:

答案 0 :(得分:0)

您需要一个 calendar ,该日历将返回所需的日期-第一个星期一(在 today 之后),然后是每个月的第一个星期一。方法如下:

SQL> with
  2  this_year as
  3    (select trunc(sysdate) + level - 1 datum
  4     from dual
  5     connect by level <= date '2019-12-31' - trunc(sysdate) + 1
  6    ),
  7  formatted as
  8    (select datum,
  9            to_char(datum, 'd') day_num,
 10            to_char(datum, 'dy', 'nls_date_language = english') day_name
 11     from this_year
 12    )
 13  select *
 14  from formatted f
 15  where 1 = 1
 16  and f.datum = (select min(f1.datum)
 17                 from formatted f1
 18                 where f1.day_num = 1
 19                   and to_char(f1.datum, 'yyyymm') = to_char(f.datum, 'yyyymm')
 20                );

DATUM      D DAY_NAME
---------- - ------------
10.06.2019 1 mon
01.07.2019 1 mon
05.08.2019 1 mon
02.09.2019 1 mon
07.10.2019 1 mon
04.11.2019 1 mon
02.12.2019 1 mon

7 rows selected.

SQL>

它是做什么的?

  • this_year CTE返回从“今天”到2019年12月31日的所有日期。如果可以使用某些最大日期,请使用它
  • formatted CTE是中间步骤;如果运行它,您将看到day_num代表一天的序数(1、2,... 7),而day_name返回其缩写名称(mon,tue,... )。我们对第一天很感兴趣,因为它代表了星期一
  • 最后一个select返回所需的结果-每个月的第一个星期一

一旦有了这些日期,就可以在当前查询中使用它们。怎么样?一个简单的选择是基于这样的查询来创建视图,例如

SQL> create or replace view v_mondays as
  2  with
  3  this_year as ...
  <snip>
View created.

SQL> select * From v_mondays;

DATUM      D DAY_NAME
---------- - ------------
10.06.2019 1 mon
01.07.2019 1 mon
<snip>
7 rows selected.

SQL>

展开后,您的查询可能如下所示:

select 
  d.item,
  i.description,
  d.market,
  case
    when d.loc like 'U%' then 'US'
    when d.loc like 'M%' then 'MX'
    when d.loc like 'C%' then 'CA'
    else 'EXP' 
  end as country,
  d.start_date as startdate,
  sum(d.demandqty) as qty
from demand d join item i on d.item = i.item 
join v_mondays m on m.datum = d.start_date                   --> join with Mondays
group by d.item, i.description, d.market, d.loc,d.start_date;