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