如何获取上个月的同一天日期?如何获取上个月的最后一天?
现在有一个变量V_ACCT_DATE,它是一个8位的字符串,用来表示日期。比如V_ACCT_DATE=‘20220215’。
获取上月同期日(上个月的同一天日期)
--1
a = to_date(V_ACCT_DATE, 'yyyymmdd')
--2
b = add_months(a, -1)
--3
c = to_char(b, 'yyyymmdd')
--合并起来写
to_char(add_months(to_date(V_ACCT_DATE, 'yyyymmdd'), -1), 'yyyymmdd')
--查看效果
select to_char(add_months(to_date(V_ACCT_DATE, 'yyyymmdd'), -1), 'yyyymmdd') from dual;
注意:
一般情况下,这一语句都能获取到上个月的同一天日期。
例如:
输入’20220215’,返回’20220115’。
但是到了月底的时候,会出现前后两个月日期不一致的情况。
当本月天数比上个月少时:
当本月日期取最后一天时,上个月取的也是最后一天(而不是上个月的同一天)。
例如:
输入’20220227’,返回’20220127’;
输入’20220228’,返回’20220131’;
当本月天数比上个月多时:
当本月日期超过上个月的月底日期时,上月日期始终取最后一天。
例如:
输入’20220327’,返回’20220227’;
输入’20220328’,返回’20220228’;
输入’20220329’,返回’20220228’;
输入’20220330’,返回’20220228’;
输入’20220331’,返回’20220228’;
获取上月最后日(上个月的最后一天)
--1
a = to_date(V_ACCT_DATE, 'yyyymmdd')
--2
b = add_months(a, -1)
--3
c = last_day(b)
--4
d = to_char(c, 'yyyymmdd')
--合并起来写
to_char(last_day(add_months(to_date(V_ACCT_DATE, 'yyyymmdd'), -1)), 'yyyymmdd')
--查看效果
select to_char(last_day(add_months(to_date(V_ACCT_DATE, 'yyyymmdd'), -1)), 'yyyymmdd') from dual
获取上月同期日(月底不特殊处理版本)
首先需要把V_ACCT_DATE拆成月份V_MONTH和日期V_DAY。
例如:如果V_ACCT_DATE=‘20220215’,则V_MONTH=‘202202’,V_DAY=‘15’。
--1. 用a记录“上个月的同一天”,用b记录“上个月的最后一天”
a = to_char(add_months(to_date(V_MONTH ,'yyyymm'),-1),'yyyymm')||V_DAY
b = to_char(last_day(add_months(to_date(V_MONTH ,'yyyymm'),-1)),'yyyymmdd')
--2. 如果a>b,则选用b
V_LMTD = b;
--3. 如果a<b,则选用a
V_LMTD = a;
--合并起来写
case
when a>b
then b
else a
end
--把a和b补充完整就是下边这样:
case
when to_char(add_months(to_date(V_MONTH ,'yyyymm'),-1),'yyyymm')||V_DAY > to_char(last_day(add_months(to_date(V_MONTH ,'yyyymm'),-1)),'yyyymmdd')
then to_char(last_day(add_months(to_date(V_MONTH ,'yyyymm'),-1)),'yyyymmdd')
else to_char(add_months(to_date(V_MONTH ,'yyyymm'),-1),'yyyymm')||V_DAY
end
--查看效果
select
case
when to_char(add_months(to_date(V_MONTH ,'yyyymm'),-1),'yyyymm')||V_DAY > to_char(last_day(add_months(to_date(V_MONTH ,'yyyymm'),-1)),'yyyymmdd')
then to_char(last_day(add_months(to_date(V_MONTH ,'yyyymm'),-1)),'yyyymmdd')
else to_char(add_months(to_date(V_MONTH ,'yyyymm'),-1),'yyyymm')||V_DAY
end
from
dual;
这种写法和第一种写法的区别是:
当本月天数比上个月少时:
当本月日期取最后一天时,上个月取的是同一天(而不是上个月的最后一天)。
例如:
输入’20220227’,返回’20220127’;
输入’20220228’,返回’20220128’;