sql计算日期间相差的年月日(可用于计算司龄等数据)

正常计算日期间差共多少年,多少月,多少日,可以用
select datediff(yy,@dt1,@dt2) – 年
select datediff(mm,@dt1,@dt2) – 月
select datediff(dd,@dt1,@dt2) – 日
以上是统一为一个单位,如果是合并,求两个日期之间差多少年余多少个月余几天,涉及进位,就有点复杂。
这里参考了
SQL 计算两个日期之间的天数 输出多少年多少月多少天 这篇文章,感谢作者。这里对其进行细微调整,让其可以单独输出年,月,日,并将整体的差值-1天以配合工作需要。

Create FUNCTION [dbo].[_GetDateInterval]
(
	@d1 as datetime,
	@d2 as datetime,
	@tt as varchar(2) -- 类型 y表示年,m表示月,d表示日
)
RETURNS nvarchar(10) 
AS
BEGIN
	-- 函数默认@d1 <= @d2,如果@d1 > @d2,则交换
	If @d1 > @d2
	Begin
		Declare @d3 as datetime
		Set @d3 = @d1
		Set @d1 = @d2
		Set @d2 = @d3	
	End
	declare @yy as int, @mm as int, @dd as int
 
	-- 先直接判断月数,每年的12个月是固定的
	set @mm = DATEDIFF(MONTH, @d1, @d2)
 
	-- 当@d1的日大于@d2+1的日(不到1个月),则月份-1
	If Day(@d1) > Day(@d2) + 1
	Begin	
		Set @mm = @mm - 1
	End
	
	-- 将@d1日期直接增加已获得的月数,以便后面直接判断天数
	set @d1 = DATEADD(MONTH, @mm, @d1)
 
	-- 根据@mm,获取年数
	set @yy = @mm / 12
 
	-- 根据@mm,将@mm取余数,获取月数
	set @mm = @mm % 12
 
	-- 获取@dd的天数,此时的@d1已经是接近@d2日期了
	set @dd = DATEDIFF(DAY, @d1, @d2)
 
	-- 将@d1日期增加1个月,判断是否与@d2相同(满月判断)
	set @d1 = DATEADD(MONTH, 1, @d1)
 
	-- 如果相同,则表示天数进位(满月),日期进位,月份+1
	If @d1 = @d2
	Begin
		Set @mm = @mm + 1
		Set @dd = 0
	End
 
	-- 最后也是判断月数是否有进位。判断@mm是否为12(逢12进1),如果是则年份+1,即@yy+1,然后@mm设为0
	If @mm = 12
	Begin
		Set @yy = @yy+1
		Set @mm = 0
	End
	
	Declare @str as nvarchar(10) 
	 set @str=''
	If  @tt = 'y'
	Begin
		Set @str = cast(@yy as varchar(10))
	End
	
	If  @tt = 'm'
	Begin
		Set @str = cast(@mm as varchar(10))
	End
	
	If  @tt = 'd'
	Begin
		Set @str = cast(@dd as varchar(10))
	End
	return @str
	END
	-- 测试  getdate() --当前时间 取得时间为2022-03-08
	select  dbo._GetDateInterval('2020-02-20',GETDATE(),'y')    --  2  年
	select  dbo._GetDateInterval('2020-02-20',GETDATE(),'m')   --  0  月
	select  dbo._GetDateInterval('2020-02-20',GETDATE(),'d')    -- 16   日
	-- 因此2020-02-20到2022-03-08  差的时间为2年零16天

以上结果到http://bjtime.cn/riqi/ 核对
在这里插入图片描述
核验正确,结束。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值