【问题标题】:How to calculate Age/Number of Years between two dates [duplicate]如何计算两个日期之间的年龄/年数[重复]
【发布时间】:2012-12-13 20:39:55
【问题描述】:

可能重复:
How to calculate age in T-SQL with years, months, and days

在我正在进行的一个项目中,我需要计算一个人加入系统时的年龄;在互联网上查看后,我发现了各种方法可以做到这一点,但其中大多数在涉及闰年时都有轻微的问题。

下面的解决方案是我如何计算过去的年数/年龄。希望这对其他人有帮助

【问题讨论】:

  • 我们可以假设我们有生日吗?闰年有什么问题?

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

您需要将以下方法添加到您的数据库中:

CREATE FUNCTION [dbo].[fnCalAge] (@DiffFrom DATE, @DiffTo DATE) RETURNS INT
AS
BEGIN
    DECLARE @NumOfYears INT
    SET @NumOfYears = (SELECT 
                         DATEDIFF(YEAR, @DiffFrom, @DiffTo) + 
                         CASE 
                           WHEN MONTH(@DiffTo) < MONTH(@DiffFrom) THEN -1 
                           WHEN MONTH(@DiffTo) > MONTH(@DiffFrom) THEN 0 
                           ELSE 
                             CASE WHEN DAY(@DiffTo) < DAY(@DiffFrom) THEN -1 ELSE 0 END 
                         END)
    IF @NumOfYears < 0
    BEGIN
        SET @NumOfYears = 0;
    END

    RETURN @NumOfYears;
END

然后在 SQL 查询中调用它,类似于以下内容:

SET DATEFORMAT dmy 

SELECT dbo.fnCalAge(CAST('20/06/1987' AS DATE), CAST('20/06/2013' AS DATE))

【讨论】:

    【解决方案2】:

    假设@bDate 是生日的日期时间,@today 是今天的日期,那么...

     Declare @bDay Date = '31 dec 2000'
     Declare @today Date = cast(getdate() as date)
     Select datediff(Year, @bDay, @today) - 
            case When datepart(dayofYear, @today) <
                      datepart(dayofYear, @bDay) Then 1 Else 0 End
    

    【讨论】:

    • 这并不总是给出正确的结果,因为datepart(dayOfYear, @date) 在考虑闰年时会出现偏差,即一年中的额外一天意味着您的生日将在 2 月 29 日之后延迟一天计算。
    【解决方案3】:

    用 DOB 代替雇用的年龄。将 sysdate 替换为您的日期,例如 to_date('28-DEC-2012') :

    SELECT empno, ename, hiredate, TRUNC(MONTHS_BETWEEN(sysdate, hiredate)/12)  years_of_service 
     FROM scott.emp
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-04
      • 2012-01-06
      • 2016-07-14
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      相关资源
      最近更新 更多