DATEDIFF将年份差异四舍五入到较低的值

时间:2019-02-08 11:37:36

标签: sql sql-server

我尝试谷歌搜索时遇到了一个问题,但大多数问题都与舍入小时或分钟有关。

我正在检查用户的生日日期,并且我有两个日期相距99.3年。这意味着用户已经99岁了,但是这段代码:

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

返回值100。是否可以将值四舍五入?

7 个答案:

答案 0 :(得分:2)

您可以使用以下逻辑来获取正确的年龄:

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

这应该是准确的,即使存在of年也是如此。基本上,它查看生日的月日部分,并检查它是否在今天或今天之后。逻辑使用这些信息来确定年龄。

答案 1 :(得分:1)

您可以使用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)

是否可以舍入天数?

您可以使用天数四舍五入,但这在某些情况下并不精确。您可以检查当前日期是否已超过出生日期(as @Cato mentioned in comments)。如果出生日期大于当天(同月),则可以减去一个月。

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

答案 2 :(得分:1)

找出整年的差异(年-出生年)这始终是该人在该年达到的年龄。如果比他们的生日早,请提前一年。

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

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

答案 3 :(得分:1)

戈登接受的解决方案很好,但是逻辑却相反?总体思路是查看当前的月份+日期是否大于生日的月份+日期,如果不是,则从年份差异中减去一年,因为它尚未达到或超过其生日。

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

答案 4 :(得分:0)

DATEDIFF(YEAR, ...)返回年份在两个日期之间改变的次数:

SELECT DATEDIFF(YEAR, '2018-12-31', '2019-01-01') -- 1

您可以尝试这种(有点复杂)的方法:

DECLARE @Date DATETIME = '2019-02-08 00:00:00';
SELECT BirthDate
     , YearDiff - CASE WHEN @Date >= BirthdayThisYear THEN 0 ELSE 1 END AS Age
FROM (VALUES
    ('2000-02-08'),
    ('2018-02-08'),
    ('2018-02-09')
) AS tests(BirthDate)
CROSS APPLY (
    SELECT DATEDIFF(YEAR, BirthDate, @Date) AS YearDiff
         , DATEADD(YEAR, DATEDIFF(YEAR, BirthDate, @Date), BirthDate) AS BirthdayThisYear
) AS calcs

结果:

BirthDate    Age
2000-02-08   19
2018-02-08   1
2018-02-09   0

答案 5 :(得分:0)

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

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

我们从当前日期中减去1天,因为另一天是'1/1/1900',这将使间隔增加一天。

答案 6 :(得分:0)

在雪花中:

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

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