我尝试谷歌搜索时遇到了一个问题,但大多数问题都与舍入小时或分钟有关。
我正在检查用户的生日日期,并且我有两个日期相距99.3年。这意味着用户已经99岁了,但是这段代码:
DATEDIFF(YEAR, r.BirthDate, ISNULL(@Date,GETDATE()))
返回值100。是否可以将值四舍五入?
答案 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)
你必须按月来做,就像你选择年份一样。