SQL 服务器 DATEDIFF 对 YEAR 差异进行四舍五入。如何舍入?

SQL Server DATEDIFF round up the YEAR difference. How to round it down?

我有一个问题,我尝试使用谷歌搜索,但大多数问题都是关于小时或分钟的四舍五入。

我正在检查用户的生日,我有两个相隔 99.3 年的日期。也就是说用户是99岁但是这段代码:

DATEDIFF(YEAR, r.BirthDate, ISNULL(@Date,GETDATE()))

returns 值为 100。有没有办法将值向下舍入?

您可以使用 MONTH 而不是 YEAR 来使用以下解决方案:

DECLARE @currdate AS DATE = '2019-02-08'

-- using YEAR
SELECT DATEDIFF(YEAR, '2000-05-01', ISNULL(@currdate, GETDATE())) -- 19

-- using MONTH
SELECT DATEDIFF(MONTH, '2000-05-01', ISNULL(@currdate, GETDATE())) / 12 -- 18

还可以ROUND上下:

DECLARE @date DATE = '2019-02-08'

SELECT CAST(ROUND(DATEDIFF(MONTH, '1999-08-01', ISNULL(@date, GETDATE())) / 12.0, 0) AS INT) 
-- 20 (19.5)

SELECT CAST(ROUND(DATEDIFF(MONTH, '1999-09-01', ISNULL(@date, GETDATE())) / 12.0, 0) AS INT) 
-- 19 (19.4)

有没有办法把天数倒数?

您可以使用天数来计算天数,但在某些情况下这并不更精确。您可以检查当前日期是否超过出生日期 ()。如果出生日期大于当天(同月),则可以减去一个月。

DECLARE @birthday AS DATE = '2000-10-25'
DECLARE @currdate AS DATE = '2100-10-24'
SELECT ((DATEDIFF(MONTH, @birthday, ISNULL(@currdate, GETDATE())) - (CASE WHEN MONTH(@birthday) = MONTH(@currdate) AND DAY(@birthday) > DAY(@currdate) THEN 1 ELSE 0 END)) / 12)
-- 99

您可以使用此逻辑获得正确的年龄:

select (case when month(birthdate) * 100 + day(birthdate) >=
                  month(getdate()) * 100 + day(getdate())
             then year(getdate()) - year(birthdate)
             else year(getdate()) - year(birthdate) - 1
        end) as age

这应该是准确的,即使存在闰年。基本上它会查看生日的月日部分,并检查它是在今天还是晚于今天。该逻辑使用此信息来确定年份。

找出整年的差值(年份 - 出生年份) 这始终是该人当年达到的年龄。早于生日就休一年

永远不要尝试使用日差除以 365.25 或 365 - 由于各种原因,在某些日期,有时在闰年左右,年龄最终可能会出现错误

SELECT YEAR(getdate()) - YEAR(birthdate)  
       - CASE WHEN MONTH(getdate()) < MONTH(birthdate) 
               OR (DAY(getdate()) < DAY(birthdate) AND MONTH(getdate()) = MONTH(birthdate) )
            THEN
                1
            ELSE
                0
            END

Gordon 接受的解决方案是好的,但逻辑是反的?大意是看当前的月+日是否大于生日的月+日,如果不是,则从年差中减去一年,因为还没有达到或超过他们的生日。

SELECT YEAR(GETDATE()) - YEAR(birthdate) 
- IIF(MONTH(GETDATE()) * 100 + DAY(GETDATE()) >= MONTH(birthdate) * 100 + DAY(birthdate), 0, 1)

解决这个问题的另一种方法(不计算日期差异 3 次或更多)是将两个值相减时得到总年数:

SELECT datediff(YEAR, '1900', DATEADD(d, -1, GETDATE()) - r.BirthDate)

我们从当前日期减去 1 天,因为另一天是“1/1/1900”,这会在间隔中增加一天。

在雪花中:

ROUND(DATEDIFF('month', "dateOfBirth", CURRENT_DATE())/12)

你必须按月来做,就像你选择年份一样。

这是修复的方法。

而不是:

DATEDIFF(YEAR, r.BirthDate, ISNULL(@Date,GETDATE()))

使用这个:

FLOOR(DATEDIFF(week, r.BirthDate, ISNULL(@Date,GETDATE())) / 52.177457)

这里 an article 证明了这个技巧非常有效。