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 证明了这个技巧非常有效。
我有一个问题,我尝试使用谷歌搜索,但大多数问题都是关于小时或分钟的四舍五入。
我正在检查用户的生日,我有两个相隔 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 证明了这个技巧非常有效。