[英]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.