正常计算日期间差共多少年,多少月,多少日,可以用
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/ 核对
在这里插入图片描述
核验正确,结束。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐