How to calculate age in T-SQL with years, months, and days

后端 未结 24 1926
无人共我
无人共我 2020-11-22 05:42

What would be the best way to calculate someone\'s age in years, months, and days in T-SQL (SQL Server 2000)?

The datediff function doesn\'t handle year

24条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-22 06:03

    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
    

提交回复
热议问题