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

时间:2017-07-23 08:47:33

标签: sql oracle postgresql oracle11g

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

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

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

01-JUL-2017
02-JUL-2017
.
.
.
30-JUL-2017

如果今天的日期是2017年8月3日那么

01-JUL-2017
02-JUL-2017
.
.
.
.
31-JUL-2017

如果今天的日期是2017年8月4日,那么

01-AUG-2017

如果今天的日期是2017年8月6日那么

 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中都需要

查询

2 个答案:

答案 0 :(得分:0)

在Postgres中,您使用generate_series()

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使用几乎相同),然后使用generate_series()来获取开始和结束之间的所有日期。

答案 1 :(得分:0)

这是第1部分的oracle解决方案。

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;