繁体   English   中英

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

[英]Oracle/PostgreSQL date level connect by query

我有要求,如果日期日期在每月的第一和第三之间,则应返回上个月的所有日期减去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都需要查询

在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部分的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;  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM