Where子句输出过去一年中每月的第一个

时间:2018-05-22 17:53:49

标签: sql oracle date

我从数据库中抽出,我需要去年每个月的第一天。这是针对将每个月运行的报告,因此我不想创建数组,然后每月必须更新该数组。到目前为止,我已将它输出到本月第一天的输出位置:

SELECT
SCART.STA_FRAME_STAT.ARRAY,
SCART.STA_FRAME_STAT.S_DATE

FROM
SCART.STA_FRAME_STAT

WHERE
(SCART.STA_FRAME_STAT.S_DATE) = (trunc(sysdate) - (to_number(to_char(sysdate,'DD')) -1 ))

其输出显示:

Array    S_DATE
1        5/1/2018
2        5/1/2018
.        .
.        .
.        .

关于我如何能够一直回到2017年5月1日的任何指导,只输出本月的第一天,所以我可以保持我的尺寸,非常感谢。顺便说一句,我在TOAD工作。

2 个答案:

答案 0 :(得分:0)

我以不同的方式处理这个问题。如果有人需要帮助,这是解决方案:

SELECT
SCART.STA_FRAME_STAT.ARRAY,
SCART.STA_FRAME_STAT.S_DATE


FROM
SCART.STA_FRAME_STAT

WHERE
to_char(SCART.STA_FRAME_STAT.S_DATE,'DD') = 01
AND 
to_char(SCART.STA_FRAME_STAT.S_DATE,'YYYY') >= 2017

答案 1 :(得分:0)

这是使用recursive with子句执行此操作的方法。这将产生每个月的第一天,从当月起12个月。

with dates(r) as
(select 0 r from dual
 union all
 select r+1 from dates
 where r < 12)

select r,
       trunc(add_months(sysdate,-1*r), 'MM') S_DATE
from dates

我的输出是:

r   S_DATE
0   01-MAY-18
1   01-APR-18
2   01-MAR-18
3   01-FEB-18
4   01-JAN-18
5   01-DEC-17
6   01-NOV-17
7   01-OCT-17
8   01-SEP-17
9   01-AUG-17
10  01-JUL-17
11  01-JUN-17
12  01-MAY-17