Oracle/PostgreSQL日期级别按查询连接

Oracle/PostgreSQL日期级别按查询连接,sql,oracle,postgresql,oracle11g,Sql,Oracle,Postgresql,Oracle11g,我有一个要求,如果日期是在第一个月和第三个月之间,它应该返回上个月的所有日期减去3天 如果日期是第4天或以上,则日期为第天减去3天 如果今天的日期是2017年8月2日,则 01-JUL-2017 02-JUL-2017 . . . 30-JUL-2017 01-JUL-2017 02-JUL-2017 . . . . 31-JUL-2017 如果今天的日期是2017年8月3日,则 01-JUL-2017 02-JUL-2017 . . . 30-JUL-2017 01-JUL-2017 0

我有一个要求,如果日期是在第一个月和第三个月之间,它应该返回上个月的所有日期减去3天

如果日期是第4天或以上,则日期为第天减去3天

如果今天的日期是2017年8月2日,则

01-JUL-2017
02-JUL-2017
.
.
.
30-JUL-2017
01-JUL-2017
02-JUL-2017
.
.
.
.
31-JUL-2017
如果今天的日期是2017年8月3日,则

01-JUL-2017
02-JUL-2017
.
.
.
30-JUL-2017
01-JUL-2017
02-JUL-2017
.
.
.
.
31-JUL-2017
如果今天的日期是2017年8月4日,则

01-AUG-2017
 01-AUG-2017
 02-AUG-2017
 03-AUG-2017
如果今天的日期是2017年8月6日,那么

01-AUG-2017
 01-AUG-2017
 02-AUG-2017
 03-AUG-2017
第二部分的查询如下所示

SELECT trunc(ADD_MONTHS((LAST_DAY(SYSDATE)),-1)+level) FROM DUAL
CONNECT BY LEVEL<=to_number(to_char(trunc(sysdate),'DD'))-3
我需要查询以处理月1日和月3日之间的日期

Oracle和Postgres中都需要查询

在您为此使用的Postgres中生成\u系列:

with limits (start_date, end_date) as (
   select case 
            when extract(day from current_date) <= 3 then 
                (date_trunc('month', current_date) - interval '1' month)::date
            else date_trunc('month', current_date)::date
          end, 
          case 
            when extract(day from current_date) <= 3 
              then date_trunc('month', current_date)::date - 3
            else current_date - 3
          end
)
select dt
from limits, generate_series(start_date, end_date, interval '1' day) as x(dt);

CTE计算的开始日期和结束日期与Oracle几乎相同,然后生成序列用于获取开始日期和结束日期之间的所有日期。

以下是Oracle第1部分的解决方案

SELECT *
FROM   (SELECT Trunc(prev_mon_dt, 'MM') + LEVEL - 1 AS days
        FROM   (SELECT CASE
                         WHEN To_char(To_date('02-08-2016', 'DD-MM-YYYY'), 'DD')
                              IN
                              ( '01', '02', '03' ) THEN
                         Add_months(To_date('02-08-2016'
                                    ,
                                    'DD-MM-YYYY'),
                         -1)
                       END prev_mon_dt
                FROM   dual)
        CONNECT BY Trunc(Trunc(prev_mon_dt, 'MM') + LEVEL - 1, 'MM') = Trunc(
                   prev_mon_dt, 'MM'))
WHERE  To_date('02-08-2016', 'DD-MM-YYYY') - days >= 3;