【问题标题】:How to calculate age in T-SQL with years, months, and days如何在 T-SQL 中用年、月和日计算年龄
【发布时间】:2010-09-08 15:02:43
【问题描述】:

在 T-SQL (SQL Server 2000) 中以年、月和日为单位计算某人年龄的最佳方法是什么?

datediff 函数不能很好地处理年份边界,而且将月份和日期分开会很麻烦。我知道我可以在客户端相对轻松地完成它,但我想在我的stored procedure 中完成它。

【问题讨论】:

  • 请参阅this answer to a javascript age question,它讨论了想出一种选择年、月和日的人类明智的方法是多么困难。我将在下一条评论中摘录。
  • "如果将 2 月 2 日到 3 月 2 日计算为 1 个月,则为 1 个月 29 天。但如果是 1 月 2 日到 3 月 1 日呢?这与它们之间经过的天数相同。是现在 1 个月(整个 4 月)+ 3 月 1 天 + 1 月 31 天 1 个月 32 天?您是否希望您的月份与物理日历一致,以便人类可以用手指回溯并获得正确的日期?这比你想象的要难得多。"

标签: tsql datediff


【解决方案1】:

下面是一些 T-SQL,它为您提供自 @date 中指定的日期以来的年数、月数和天数。它考虑到 DATEDIFF() 在不考虑月份或日期的情况下计算差异这一事实(因此 8/31 和 9/1 之间的月份差异为 1 个月)并使用递减结果的 case 语句来处理它合适。

DECLARE @date datetime, @tmpdate datetime, @years int, @months int, @days int
SELECT @date = '2/29/04'

SELECT @tmpdate = @date

SELECT @years = DATEDIFF(yy, @tmpdate, GETDATE()) - CASE WHEN (MONTH(@date) > MONTH(GETDATE())) OR (MONTH(@date) = MONTH(GETDATE()) AND DAY(@date) > DAY(GETDATE())) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(yy, @years, @tmpdate)
SELECT @months = DATEDIFF(m, @tmpdate, GETDATE()) - CASE WHEN DAY(@date) > DAY(GETDATE()) THEN 1 ELSE 0 END
SELECT @tmpdate = DATEADD(m, @months, @tmpdate)
SELECT @days = DATEDIFF(d, @tmpdate, GETDATE())

SELECT @years, @months, @days

【讨论】:

  • 以上注释的语法缩短是错误的;需要单独检查更大的月份,然后如果月份相同,则进行日检查
  • 是的,如果当前日期是当月的 30 日并且正在评估的日期是下个月的 1 日,那么缩短的语法就不能正常工作。
  • 临时日期变量的原因是什么? @@tmpdate 和 @@date 都在 2 个表达式中使用。与仅使用一个相比,这是否预期会做一些不同的事情?
【解决方案2】:

试试这个...

SELECT CASE WHEN
 (DATEADD(year,DATEDIFF(year, @datestart  ,@dateend) , @datestart) > @dateend)
THEN DATEDIFF(year, @datestart  ,@dateend) -1
ELSE DATEDIFF(year, @datestart  ,@dateend)
END

基本上是 "DateDiff(year...", 给你这个人今年的年龄,所以我只是添加一个案例陈述,如果他们今年还没有生日,那么减 1年,否则返回值。

【讨论】:

  • 如果您只需要自该日期以来的年数,这很有用。
  • 稍短的版本SELECT DATEDIFF(year, @datestart ,@dateend) + CASE WHEN (DATEADD(year,DATEDIFF(year, @datestart ,@dateend) , @datestart) > @dateend) THEN - 1 ELSE 0 END
【解决方案3】:

以文本形式获取年龄的简单方法如下:

Select cast((DATEDIFF(m, date_of_birth, GETDATE())/12) as varchar) + ' Y & ' + 
       cast((DATEDIFF(m, date_of_birth, GETDATE())%12) as varchar) + ' M' as Age

结果格式为:

**63 Y & 2 M**

【讨论】:

    【解决方案4】:

    通过 ISO 格式日期的算术实现。

    declare @now date,@dob date, @now_i int,@dob_i int, @days_in_birth_month int
    declare @years int, @months int, @days int
    set @now = '2013-02-28' 
    set @dob = '2012-02-29' -- Date of Birth
    
    set @now_i = convert(varchar(8),@now,112) -- iso formatted: 20130228
    set @dob_i = convert(varchar(8),@dob,112) -- iso formatted: 20120229
    set @years = ( @now_i - @dob_i)/10000
    -- (20130228 - 20120229)/10000 = 0 years
    
    set @months =(1200 + (month(@now)- month(@dob))*100 + day(@now) - day(@dob))/100 %12
    -- (1200 + 0228 - 0229)/100 % 12 = 11 months
    
    set @days_in_birth_month = day(dateadd(d,-1,left(convert(varchar(8),dateadd(m,1,@dob),112),6)+'01'))
    set @days = (sign(day(@now) - day(@dob))+1)/2 * (day(@now) - day(@dob))
              + (sign(day(@dob) - day(@now))+1)/2 * (@days_in_birth_month - day(@dob) + day(@now))
    -- ( (-1+1)/2*(28 - 29) + (1+1)/2*(29 - 29 + 28))
    -- Explain: if the days of now is bigger than the days of birth, then diff the two days
    --          else add the days of now and the distance from the date of birth to the end of the birth month 
    select @years,@months,@days -- 0, 11, 28 
    

    测试用例

    天数的接近与公认的答案不同,差异显示在下面的 cmets 中:

           dob        now  years  months  days 
    2012-02-29 2013-02-28      0      11    28  --Days will be 30 if calculated by the approach in accepted answer. 
    2012-02-29 2016-02-28      3      11    28  --Days will be 31 if calculated by the approach in accepted answer, since the day of birth will be changed to 28 from 29 after dateadd by years. 
    2012-02-29 2016-03-31      4       1     2
    2012-01-30 2016-02-29      4       0    30
    2012-01-30 2016-03-01      4       1     2  --Days will be 1 if calculated by the approach in accepted answer, since the day of birth will be changed to 30 from 29 after dateadd by years.
    2011-12-30 2016-02-29      4       1    30
    

    Days by case 语句的简短版本:

    set @days = CASE WHEN day(@now) >= day(@dob) THEN day(@now) - day(@dob)
                     ELSE @days_in_birth_month - day(@dob) + day(@now) END
    

    如果您只想要年和月的年龄,可能会更简单

    set @years = ( @now_i/100 - @dob_i/100)/100
    set @months =(12 + month(@now) - month(@dob))%12 
    select @years,@months -- 1, 0
    

    注意:一个非常有用的链接SQL Server Date Formats

    【讨论】:

      【解决方案5】:

      这是一个(稍微)简单的版本:

      CREATE PROCEDURE dbo.CalculateAge 
          @dayOfBirth datetime
      AS
      
      DECLARE @today datetime, @thisYearBirthDay datetime
      DECLARE @years int, @months int, @days int
      
      SELECT @today = GETDATE()
      
      SELECT @thisYearBirthDay = DATEADD(year, DATEDIFF(year, @dayOfBirth, @today), @dayOfBirth)
      
      SELECT @years = DATEDIFF(year, @dayOfBirth, @today) - (CASE WHEN @thisYearBirthDay > @today THEN 1 ELSE 0 END)
      
      SELECT @months = MONTH(@today - @thisYearBirthDay) - 1
      
      SELECT @days = DAY(@today - @thisYearBirthDay) - 1
      
      SELECT @years, @months, @days
      GO
      

      【讨论】:

        【解决方案6】:

        和函数一样的东西。

        create function [dbo].[Age](@dayOfBirth datetime, @today datetime)
           RETURNS varchar(100)
        AS
        
        Begin
        DECLARE @thisYearBirthDay datetime
        DECLARE @years int, @months int, @days int
        
        set @thisYearBirthDay = DATEADD(year, DATEDIFF(year, @dayOfBirth, @today), @dayOfBirth)
        set @years = DATEDIFF(year, @dayOfBirth, @today) - (CASE WHEN @thisYearBirthDay > @today THEN 1 ELSE 0 END)
        set @months = MONTH(@today - @thisYearBirthDay) - 1
        set @days = DAY(@today - @thisYearBirthDay) - 1
        
        return cast(@years as varchar(2)) + ' years,' + cast(@months as varchar(2)) + ' months,' + cast(@days as varchar(3)) + ' days'
        end
        

        【讨论】:

        • SELECT dbo.age('2013-03-31', '2014-01-31') 返回 10m2d。
        【解决方案7】:
        create  procedure getDatedifference
        
        (
            @startdate datetime,
            @enddate datetime
        )
        as
        begin
            declare @monthToShow int
            declare @dayToShow int
        
            --set @startdate='01/21/1934'
            --set @enddate=getdate()
        
            if (DAY(@startdate) > DAY(@enddate))
                begin
                    set @dayToShow=0
        
                    if (month(@startdate) > month(@enddate))
                        begin
                            set @monthToShow=  (12-month(@startdate)+ month(@enddate)-1)
                        end
                    else if (month(@startdate) < month(@enddate))
                        begin
                            set @monthToShow=  ((month(@enddate)-month(@startdate))-1)
                        end
                    else
                       begin
                           set @monthToShow=  11
                       end
                    -- set @monthToShow= convert(int, DATEDIFF(mm,0,DATEADD(dd,DATEDIFF(dd,0,@enddate)- DATEDIFF(dd,0,@startdate),0)))-((convert(int,FLOOR(DATEDIFF(day, @startdate, @enddate) / 365.25))*12))-1
                                 if(@monthToShow<0)
                                 begin
                                    set @monthToShow=0
                                 end
        
                              declare @amonthbefore integer
                              set @amonthbefore=Month(@enddate)-1
                                  if(@amonthbefore=0)
                                     begin
                                        set @amonthbefore=12
                                      end
        
        
                              if (@amonthbefore  in(1,3,5,7,8,10,12))
                                  begin
                                    set @dayToShow=31-DAY(@startdate)+DAY(@enddate)
                                  end
                              if (@amonthbefore=2)
                                 begin
                                   IF (YEAR( @enddate ) % 4 = 0 AND YEAR( @enddate ) % 100 != 0) OR  YEAR( @enddate ) % 400 = 0
                                         begin
                                            set @dayToShow=29-DAY(@startdate)+DAY(@enddate)
                                          end
                                   else
                                       begin
                                           set @dayToShow=28-DAY(@startdate)+DAY(@enddate)
                                   end
                              end
                              if (@amonthbefore in (4,6,9,11))
                                begin
                                   set @dayToShow=30-DAY(@startdate)+DAY(@enddate)
                                end
                         end
            else
                begin
                  --set @monthToShow=convert(int, DATEDIFF(mm,0,DATEADD(dd,DATEDIFF(dd,0,@enddate)- DATEDIFF(dd,0,@startdate),0)))-((convert(int,FLOOR(DATEDIFF(day, @startdate, @enddate) / 365.25))*12))
                  if (month(@enddate)< month(@startdate))
                      begin
                         set @monthToShow=12+(month(@enddate)-month(@startdate))
                      end
                  else
                      begin
                        set @monthToShow= (month(@enddate)-month(@startdate))
                      end
                  set @dayToShow=DAY(@enddate)-DAY(@startdate)
                end
        
            SELECT
                FLOOR(DATEDIFF(day, @startdate, @enddate) / 365.25) as [yearToShow],
                  @monthToShow as  monthToShow ,@dayToShow as dayToShow ,
                convert(varchar,FLOOR(DATEDIFF(day, @startdate, @enddate) / 365.25)) +' Year ' + convert(varchar,@monthToShow) +' months '+convert(varchar,@dayToShow)+' days ' as age
        
            return
        end
        

        【讨论】:

          【解决方案8】:

          我使用我修改的这个函数(Days 部分)来自@Dane 答案:https://stackoverflow.com/a/57720/2097023

          CREATE FUNCTION dbo.EdadAMD
              (
                  @FECHA DATETIME
              )
              RETURNS NVARCHAR(10)
              AS
              BEGIN
                  DECLARE
                      @tmpdate DATETIME
                    , @years   INT
                    , @months  INT
                    , @days    INT
                    , @EdadAMD NVARCHAR(10);
          
                  SELECT @tmpdate = @FECHA;
          
                  SELECT @years = DATEDIFF(yy, @tmpdate, GETDATE()) - CASE
                                                    WHEN (MONTH(@FECHA) >    MONTH(GETDATE()))
                                                       OR (
                                                          MONTH(@FECHA) = MONTH(GETDATE())
                                                    AND DAY(@FECHA) > DAY(GETDATE())
                                                    ) THEN
                                                          1
                                                      ELSE
                                                          0
                                              END;
              SELECT @tmpdate = DATEADD(yy, @years, @tmpdate);
              SELECT @months = DATEDIFF(m, @tmpdate, GETDATE()) - CASE
                                        WHEN DAY(@FECHA) > DAY(GETDATE()) THEN
                                                                      1
                                                                  ELSE
                                                                      0
                                                              END;
              SELECT @tmpdate = DATEADD(m, @months, @tmpdate);
          
              IF MONTH(@FECHA) = MONTH(GETDATE())
                 AND DAY(@FECHA) > DAY(GETDATE())
                    SELECT @days = 
                      DAY(EOMONTH(GETDATE(), -1)) - (DAY(@FECHA) - DAY(GETDATE()));
              ELSE
                  SELECT @days = DATEDIFF(d, @tmpdate, GETDATE());
          
              SELECT @EdadAMD = CONCAT(@years, 'a', @months, 'm', @days, 'd');
          
              RETURN @EdadAMD;
          
          END; 
          GO
          

          效果很好。

          【讨论】:

            【解决方案9】:

            我已经多次看到这个问题,结果输出年、月、日,但从未输出数字/十进制结果。 (至少不是一个不正确舍入的)。 我欢迎对此功能的反馈。可能还不需要一点调整。

            -- 函数的输入是两个日期。 -- 输出是 Decimal(7,4) 格式的两个日期之间的数字年数。 -- 输出总是一个正数。

            -- 注意:如果差值大于 999.9999,则输出不处理

            -- 逻辑基于三个步骤。 -- 1) 差值小于 1 年(0.5000、0.3333、0.6667 等) -- 2) 差值是整数年吗(1、2、3 等)

            -- 3) (Else)...区别是年和一些天数。 (1.5000、2.3333、7.6667 等)



            CREATE Function [dbo].[F_Get_Actual_Age](@pi_date1 datetime,@pi_date2 datetime)
            RETURNS Numeric(7,4)
            AS
            BEGIN
            
            Declare 
             @l_tmp_date    DATETIME
            ,@l_days1       DECIMAL(9,6)
            ,@l_days2       DECIMAL(9,6)
            ,@l_result      DECIMAL(10,6)
            ,@l_years       DECIMAL(7,4)
            
            
              --Check to make sure there is a date for both inputs
              IF @pi_date1 IS NOT NULL and @pi_date2 IS NOT NULL  
              BEGIN
            
                IF @pi_date1 > @pi_date2 --Make sure the "older" date is in @pi_date1
                  BEGIN
                    SET @l_tmp_date = @pi_date2
                    SET @pi_date2 = @Pi_date1
                    SET @pi_date1 = @l_tmp_date
                  END
            
                --Check #1 If date1 + 1 year is greater than date2, difference must be less than 1 year
                IF DATEADD(YYYY,1,@pi_date1) > @pi_date2  
                  BEGIN
                      --How many days between the two dates (numerator)
                    SET @l_days1 = DATEDIFF(dd,@pi_date1, @pi_date2) 
                      --subtract 1 year from date2 and calculate days bewteen it and date2
                      --This is to get the denominator and accounts for leap year (365 or 366 days)
                    SET @l_days2 = DATEDIFF(dd,dateadd(yyyy,-1,@pi_date2),@pi_date2) 
                    SET @l_years = @l_days1 / @l_days2 -- Do the math
                  END
                ELSE
                  --Check #2  Are the dates an exact number of years apart.
                  --Calculate years bewteen date1 and date2, then add the years to date1, compare dates to see if exactly the same.
                  IF DATEADD(YYYY,DATEDIFF(YYYY,@pi_date1,@pi_date2),@pi_date1) = @pi_date2  
                    SET @l_years = DATEDIFF(YYYY,@pi_date1, @pi_date2) --AS Years, 'Exactly even Years' AS Msg
                  ELSE
                  BEGIN
                    --Check #3 The rest of the cases.
                    --Check if datediff, returning years, over or under states the years difference
                    SET @l_years = DATEDIFF(YYYY,@pi_date1, @pi_date2)
                    IF DATEADD(YYYY,@l_years,@pi_date1) > @pi_date2
                      SET @l_years = @l_years -1
                      --use basicly same logic as in check #1  
                    SET @l_days1 = DATEDIFF(dd,DATEADD(YYYY,@l_years,@pi_date1), @pi_date2) 
                    SET @l_days2 = DATEDIFF(dd,dateadd(yyyy,-1,@pi_date2),@pi_date2) 
                    SET @l_years = @l_years + @l_days1 / @l_days2
                    --SELECT @l_years AS Years, 'Years Plus' AS Msg
                  END
              END
              ELSE
                SET @l_years = 0  --If either date was null
            
            RETURN @l_Years  --Return the result as decimal(7,4)
            END  
            

            `

            【讨论】:

              【解决方案10】:

              相当老的问题,但我想分享我为计算年龄所做的工作

                  Declare @BirthDate As DateTime
              Set @BirthDate = '1994-11-02'
              
              SELECT DATEDIFF(YEAR,@BirthDate,GETDATE()) - (CASE 
              WHEN MONTH(@BirthDate)> MONTH(GETDATE()) THEN 1 
              WHEN MONTH(@BirthDate)= MONTH(GETDATE()) AND DAY(@BirthDate) > DAY(GETDATE()) THEN 1 
              Else 0 END)
              

              【讨论】:

                【解决方案11】:

                您是否要计算一个年龄的总天数/月数/年数?你有开始日期吗?还是您要剖析它(例如:24 年 1 个月 29 天)?

                如果您有一个开始日期,datediff 将使用以下命令输出总天数/月数/年数:

                Select DateDiff(d,'1984-07-12','2008-09-11')
                
                Select DateDiff(m,'1984-07-12','2008-09-11')
                
                Select DateDiff(yyyy,'1984-07-12','2008-09-11')
                

                各自的输出为 (8827/290/24)。

                现在,如果您想使用解剖方法,则必须减去以天为单位的年数(天 - 365* 年),然后对其进行进一步的数学运算以获得月份等。

                【讨论】:

                • 当我调用 SELECT DateDiff(yyyy,'1984-07-12','2008-09-11') AS 'age' FROM tbl_product;得到错误:未捕获的错误:没有这样的列:yyyy
                【解决方案12】:

                这里是 SQL 代码,它为您提供自 sysdate 以来的年数、月数和天数。 输入此格式的 input_birth_date 的值 (dd_mon_yy)。注意:输入相同的值(出生日期)为年、月和日,例如 01-mar-85

                select trunc((sysdate -to_date('&input_birth_date_dd_mon_yy'))/365) years,
                trunc(mod(( sysdate -to_date('&input_birth_date_dd_mon_yy'))/365,1)*12) months,
                trunc((mod((mod((sysdate -to_date('&input_birth_date_dd_mon_yy'))/365,1)*12),1)*30)+1) days 
                 from dual
                

                【讨论】:

                • 这是 Oracle PL/SQL 语法,而不是 T-SQL。它还假设年总是 365 天,月总是 30 天
                【解决方案13】:

                DateTime T-SQL 中的值存储为浮点数。您只需将日期相减,您现在就有了一个新日期,即它们之间的时间跨度。

                declare @birthdate datetime
                set @birthdate = '6/15/1974'
                
                --age in years - short version
                print year(getdate() - @birthdate) - year(0)
                
                --age in years - visualization
                declare @mindate datetime
                declare @span datetime
                
                set @mindate = 0
                set @span = getdate() - @birthdate
                
                print @mindate
                print @birthdate
                print getdate()
                print @span
                --substract minyear from spanyear to get age in years
                print year(@span) - year(@mindate)
                print month(@span)
                print day(@span)
                

                【讨论】:

                • 我猜你还需要从月份和日期中减去 1。 (实际上,您将分别减去month(@span)day(@span),这与减去year(@span) 一致)。这个答案和Leonardo的一样,也是simon831以函数的形式转发的。反正不靠谱。准确性/错误似乎取决于当月的天数以及@birthdate 月份的天数。今天是4/5/2012,我尝试了你对set @birthdate = '4/5/1974' 的建议,得到了38 0 1,尽管它应该是38 0 0
                【解决方案14】:
                CREATE FUNCTION DBO.GET_AGE
                (
                @DATE AS DATETIME
                )
                RETURNS VARCHAR(MAX)
                AS
                BEGIN
                
                DECLARE @YEAR  AS VARCHAR(50) = ''
                DECLARE @MONTH AS VARCHAR(50) = ''
                DECLARE @DAYS  AS VARCHAR(50) = ''
                DECLARE @RESULT AS VARCHAR(MAX) = ''
                
                SET @YEAR  = CONVERT(VARCHAR,(SELECT DATEDIFF(MONTH,CASE WHEN DAY(@DATE) > DAY(GETDATE()) THEN DATEADD(MONTH,1,@DATE) ELSE @DATE END,GETDATE()) / 12 ))
                SET @MONTH = CONVERT(VARCHAR,(SELECT DATEDIFF(MONTH,CASE WHEN DAY(@DATE) > DAY(GETDATE()) THEN DATEADD(MONTH,1,@DATE) ELSE @DATE END,GETDATE()) % 12 ))
                SET @DAYS = DATEDIFF(DD,DATEADD(MM,CONVERT(INT,CONVERT(INT,@YEAR)*12 + CONVERT(INT,@MONTH)),@DATE),GETDATE())
                
                SET @RESULT = (RIGHT('00' + @YEAR, 2) + ' YEARS ' + RIGHT('00' + @MONTH, 2) + ' MONTHS ' + RIGHT('00' + @DAYS, 2) + ' DAYS')
                
                RETURN @RESULT
                END
                
                SELECT DBO.GET_AGE('04/12/1986')
                

                【讨论】:

                  【解决方案15】:
                  DECLARE @BirthDate datetime, @AgeInMonths int
                  SET @BirthDate = '10/5/1971'
                  SET @AgeInMonths                              -- Determine the age in "months old":
                      = DATEDIFF(MONTH, @BirthDate, GETDATE())  -- .Get the difference in months
                      - CASE WHEN DATEPART(DAY,GETDATE())       -- .If today was the 1st to 4th,
                                < DATEPART(DAY,@BirthDate)      --   (or before the birth day of month)
                             THEN 1 ELSE 0 END                  --   ... don't count the month.
                  SELECT @AgeInMonths / 12 as AgeYrs            -- Divide by 12 months to get the age in years
                        ,@AgeInMonths % 12 as AgeXtraMonths     -- Get the remainder of dividing by 12 months = extra months
                        ,DATEDIFF(DAY                           -- For the extra days, find the difference between, 
                                 ,DATEADD(MONTH, @AgeInMonths   -- 1. Last Monthly Birthday 
                                               , @BirthDate)    --     (if birthdays were celebrated monthly)
                                 ,GETDATE()) as AgeXtraDays     -- 2. Today's date.
                  

                  【讨论】:

                  • 要在答案中包含代码块,请将其缩进 4 个空格,以使其格式正确。我编辑了你的帖子以符合这一点。
                  【解决方案16】:

                  对于那些想要在表中创建计算列来存储年龄的人:

                  CASE WHEN DateOfBirth< DATEADD(YEAR, (DATEPART(YEAR, GETDATE()) - DATEPART(YEAR, DateOfBirth))*-1, GETDATE()) 
                       THEN DATEPART(YEAR, GETDATE()) - DATEPART(YEAR, DateOfBirth)
                       ELSE DATEPART(YEAR, GETDATE()) - DATEPART(YEAR, DateOfBirth) -1 END
                  

                  【讨论】:

                    【解决方案17】:

                    有一个简单的方法,基于两天之间的小时数,但结束日期被截断。

                    SELECT CAST(DATEDIFF(hour,Birthdate,CAST(GETDATE() as Date))/8766.0 as INT) AS Age FROM <YourTable>
                    

                    这已被证明是非常准确和可靠的。如果不是 GETDATE() 上的内部 CAST,它可能会在午夜前几个小时翻转生日,但是使用 CAST,它会随着年龄在恰好午夜发生变化而死。

                    【讨论】:

                    • 关闭,但我不会称之为“非常准确”。它将每年视为 365.25 天,这可能会产生差一的结果。示例:“2021-01-01”到“2022-01-01”产生年龄 = 0。
                    【解决方案18】:

                    这是我如何计算给定出生日期和当前日期的年龄。

                    select case 
                                when cast(getdate() as date) = cast(dateadd(year, (datediff(year, '1996-09-09', getdate())), '1996-09-09') as date)
                                    then dateDiff(yyyy,'1996-09-09',dateadd(year, 0, getdate()))
                                else dateDiff(yyyy,'1996-09-09',dateadd(year, -1, getdate()))
                            end as MemberAge
                    go
                    

                    【讨论】:

                      【解决方案19】:

                      还有另一种计算年龄的方法是

                      见下表

                          FirstName       LastName    DOB
                          sai             krishnan    1991-11-04
                          Harish          S A         1998-10-11
                      

                      求年龄,可以按月计算

                        Select datediff(MONTH,DOB,getdate())/12 as dates from [Organization].[Employee]
                      

                      结果将是

                      firstname   dates
                      sai         27
                      Harish      20
                      

                      【讨论】:

                        【解决方案20】:
                        declare @StartDate datetime = '2016-01-31'
                        declare @EndDate datetime = '2016-02-01'
                        SELECT @StartDate AS [StartDate]
                              ,@EndDate AS [EndDate]
                              ,DATEDIFF(Year,@StartDate,@EndDate) - CASE WHEN DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate), @StartDate) > @EndDate THEN 1 ELSE 0 END AS [Years]
                              ,DATEDIFF(Month,(DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate) - CASE WHEN DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate), @StartDate) > @EndDate THEN 1 ELSE 0 END,@StartDate)),@EndDate) - CASE WHEN DATEADD(Month, DATEDIFF(Month,DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate) - CASE WHEN DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate), @StartDate) > @EndDate THEN 1 ELSE 0 END,@StartDate),@EndDate) , @StartDate) > @EndDate THEN 1 ELSE 0 END AS [Months]
                              ,DATEDIFF(Day, DATEADD(Month,DATEDIFF(Month, (DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate) - CASE WHEN DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate), @StartDate) > @EndDate THEN 1 ELSE 0 END,@StartDate)),@EndDate) - CASE WHEN DATEADD(Month, DATEDIFF(Month,DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate) - CASE WHEN DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate), @StartDate) > @EndDate THEN 1 ELSE 0 END,@StartDate),@EndDate) , @StartDate) > @EndDate THEN 1 ELSE 0 END  ,DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate) - CASE WHEN DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate), @StartDate) > @EndDate THEN 1 ELSE 0 END,@StartDate)) ,@EndDate) - CASE WHEN DATEADD(Day,DATEDIFF(Day, DATEADD(Month,DATEDIFF(Month, (DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate) - CASE WHEN DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate), @StartDate) > @EndDate THEN 1 ELSE 0 END,@StartDate)),@EndDate) - CASE WHEN DATEADD(Month, DATEDIFF(Month,DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate) - CASE WHEN DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate), @StartDate) > @EndDate THEN 1 ELSE 0 END,@StartDate),@EndDate) , @StartDate) > @EndDate THEN 1 ELSE 0 END  ,DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate) - CASE WHEN DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate), @StartDate) > @EndDate THEN 1 ELSE 0 END,@StartDate)) ,@EndDate),DATEADD(Month,DATEDIFF(Month, (DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate) - CASE WHEN DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate), @StartDate) > @EndDate THEN 1 ELSE 0 END,@StartDate)),@EndDate) - CASE WHEN DATEADD(Month, DATEDIFF(Month,DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate) - CASE WHEN DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate), @StartDate) > @EndDate THEN 1 ELSE 0 END,@StartDate),@EndDate) , @StartDate) > @EndDate THEN 1 ELSE 0 END  ,DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate) - CASE WHEN DATEADD(Year,DATEDIFF(Year,@StartDate,@EndDate), @StartDate) > @EndDate THEN 1 ELSE 0 END,@StartDate))) > @EndDate THEN 1 ELSE 0 END AS [Days]
                        

                        【讨论】:

                          【解决方案21】:
                          select DOB as Birthdate,
                                 YEAR(GETDATE()) as ThisYear, 
                                 YEAR(getdate()) - EAR(date1) as Age   
                          from TableName
                          

                          【讨论】:

                          • @Gvidas EAR(date1)?这是一个内置功能 [sic] 吗?
                          【解决方案22】:
                          SELECT DOB AS Birthdate ,
                                 YEAR(GETDATE()) AS ThisYear,
                                 YEAR(getdate()) - YEAR(DOB) AS Age
                          FROM tableprincejain
                          

                          【讨论】:

                          【解决方案23】:
                          DECLARE @DoB AS DATE = '1968-10-24'
                          DECLARE @cDate AS DATE = CAST('2000-10-23' AS DATE)
                          
                          SELECT 
                          --Get Year difference
                          DATEDIFF(YEAR,@DoB,@cDate) -
                          --Cases where year difference will be augmented
                          CASE 
                              --If Date of Birth greater than date passed return 0
                              WHEN YEAR(@DoB) - YEAR(@cDate) >= 0 THEN DATEDIFF(YEAR,@DoB,@cDate)
                          
                              --If date of birth month less than date passed subtract one year
                              WHEN MONTH(@DoB) - MONTH(@cDate) > 0 THEN 1 
                          
                              --If date of birth day less than date passed subtract one year
                              WHEN MONTH(@DoB) - MONTH(@cDate) = 0 AND DAY(@DoB) - DAY(@cDate) > 0 THEN 1 
                          
                              --All cases passed subtract zero
                              ELSE 0
                          END
                          

                          【讨论】:

                            【解决方案24】:
                            declare @BirthDate datetime
                            declare @TotalYear int
                            declare @TotalMonths int
                            declare @TotalDays int
                            declare @TotalWeeks int
                            declare @TotalHours int
                            declare @TotalMinute int
                            declare @TotalSecond int
                            declare @CurrentDtTime datetime
                            set @BirthDate='1998/01/05 05:04:00'  -- Set Your date here
                            set @TotalYear= FLOOR(DATEDIFF(DAY, @BirthDate, GETDATE()) / 365.25)
                            set @TotalMonths= FLOOR(DATEDIFF(DAY,DATEADD(year, @TotalYear,@BirthDate),GetDate()) / 30.436875E)
                            set @TotalDays= FLOOR(DATEDIFF(DAY, DATEADD(month, @TotalMonths,DATEADD(year, 
                                @TotalYear,@BirthDate)), GETDATE()))
                            set @CurrentDtTime=CONVERT(datetime,CONVERT(varchar(50), DATEPART(year, 
                                GetDate()))+'/' +CONVERT(varchar(50), DATEPART(MONTH, GetDate()))
                                +'/'+ CONVERT(varchar(50),DATEPART(DAY, GetDate()))+' '
                                + CONVERT(varchar(50),DATEPART(HOUR, @BirthDate))+':'+ 
                                 CONVERT(varchar(50),DATEPART(MINUTE, @BirthDate))+
                               ':'+ CONVERT(varchar(50),DATEPART(Second, @BirthDate)))
                            set @TotalHours = DATEDIFF(hour, @CurrentDtTime, GETDATE())
                            if(@TotalHours < 0)
                            begin
                               set @TotalHours = DATEDIFF(hour,DATEADD(Day,-1, @CurrentDtTime), GETDATE())
                               set @TotalDays= @TotalDays -1  
                             end
                            set @TotalMinute= DATEPART(MINUTE, GETDATE())-DATEPART(MINUTE, @BirthDate)
                             if(@TotalMinute < 0)
                            set @TotalMinute = DATEPART(MINUTE, DATEADD(hour,-1,GETDATE()))+(60-DATEPART(MINUTE, 
                               @BirthDate))
                            
                            set @TotalSecond= DATEPART(Second, GETDATE())-DATEPART(Second, @BirthDate)
                            
                             Print 'Your age are'+ CHAR(13)
                             + CONVERT(varchar(50), @TotalYear)+' Years, ' +
                               CONVERT(varchar(50),@TotalMonths) +' Months, ' +
                               CONVERT(varchar(50),@TotalDays)+' Days, ' +
                               CONVERT(varchar(50),@TotalHours)+' Hours, ' +
                               CONVERT(varchar(50),@TotalMinute)+' Minutes, ' + 
                               CONVERT(varchar(50),@TotalSecond)+' Seconds. ' +char(13)+
                                 'Your are born at day of week was - ' + CONVERT(varchar(50),DATENAME(dw , 
                                 @BirthDate ))
                              +char(13)+char(13)+
                            +'Your Birthdate to till date your '+ CHAR(13)
                            +'Years - ' + CONVERT(varchar(50), FLOOR(DATEDIFF(DAY, @BirthDate, GETDATE()) / 
                               365.25))
                            +' , Months - ' + CONVERT(varchar(50),DATEDIFF(MM,@BirthDate,getdate())) 
                            +' , Weeks - ' + CONVERT(varchar(50),DATEDIFF(wk,@BirthDate,getdate()))
                            +' , Days - ' + CONVERT(varchar(50),DATEDIFF(dd,@BirthDate,getdate()))+char(13)+
                            +'Hours - ' + CONVERT(varchar(50),DATEDIFF(HH,@BirthDate,getdate()))
                            +' , Minutes - ' + CONVERT(varchar(50),DATEDIFF(mi,@BirthDate,getdate()))
                            +' , Seconds - ' + CONVERT(varchar(50),DATEDIFF(ss,@BirthDate,getdate()))
                            

                            输出

                            Your age are
                            22 Years, 0 Months, 2 Days, 11 Hours, 30 Minutes, 16 Seconds. 
                            Your are born at day of week was - Monday
                            
                            Your Birthdate to till date your 
                            Years - 22 , Months - 264 , Weeks - 1148 , Days - 8037
                            Hours - 192899 , Minutes - 11573970 , Seconds - 694438216
                            

                            【讨论】:

                              猜你喜欢
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2020-09-25
                              • 1970-01-01
                              • 1970-01-01
                              • 2010-10-01
                              • 2021-05-16
                              相关资源
                              最近更新 更多