【数据库SQL】如何获取上月同期日(上个月的同一天)

如何获取上个月的同一天日期?如何获取上个月的最后一天?

现在有一个变量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’;

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值