正常计算日期间差共多少年,多少月,多少日,可以用
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/ 核对
核验正确,结束。
更多推荐