获取年、月和日的日期差SQL

获取年、月和日的日期差SQL,sql,sql-server,date,date-difference,Sql,Sql Server,Date,Date Difference,有没有一种方法可以根据今天的日期和生日来计算一个人的年龄,然后以以下方式显示: If a user is less than (<) 1 year old THEN show their age in MM & days. Example: 10 months & 2 days old If a user is more than 1 year old AND less than 6 years old THEN show their age in YY &

有没有一种方法可以根据今天的日期和生日来计算一个人的年龄,然后以以下方式显示:

If a user is less than (<) 1 year old THEN show their age in MM & days.
Example:  10 months & 2 days old 

If a user is more than 1 year old AND less than 6 years old THEN show their age in YY & MM & days.
Example:  5 years & 3 months & 10 days old

If a user is more than 6 years old THEN display their age in YY.
Example:  12 years

如果用户小于(这基本上就是您要寻找的:

DECLARE @date1 DATETIME
     , @date2 DATETIME;

SELECT @date1 = '1/1/2008'
    , @date2 = GETDATE();
SELECT CASE
         WHEN DATEDIFF(YEAR, @date1, @date2) < 1 THEN CAST(DATEDIFF(mm, @date1, @date2) AS VARCHAR)+' Months & '+CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, @date1, @date2), @date1), @date2) AS VARCHAR)+' Days'
         WHEN DATEDIFF(YEAR, @date1, @date2) BETWEEN 1 AND 5 THEN CAST(DATEDIFF(mm, @date1, @date2) / 12 AS VARCHAR)+' Years & '+CAST(DATEDIFF(mm, @date1, @date2) % 12 AS VARCHAR)+' Months'
         WHEN DATEDIFF(YEAR, @date1, @date2) >= 6 THEN CAST(DATEDIFF(YEAR, @date1, @date2) AS VARCHAR)+' Years'
      END;
DECLARE@date1 DATETIME
,@date2-DATETIME;
选择@date1='1/1/2008'
,@date2=GETDATE();
选择案例
当DATEDIFF(年,@date1,@date2)<1时,将DATEDIFF(mm,@date1,@date2)转换为VARCHAR)+“月和”+将DATEDIFF(dd,DATEADD(mm,DATEDIFF(mm,@date1,@date2),@date2)转换为VARCHAR)+“天”
当DATEDIFF(YEAR,@date1,@date2)介于1和5之间时,则将DATEDIFF(mm,@date1,@date2)/12转换为VARCHAR)+“年和”+转换为DATEDIFF(mm,@date1,@date2)%12转换为VARCHAR)+“月”
当DATEDIFF(YEAR,@date1,@date2)>=6时,则将(DATEDIFF(YEAR,@date1,@date2)转换为VARCHAR)+“Years”
结束;

当用户少于上一个问题中的()时的结果

你可以这样做

       CREATE procedure [dbo].[proc_datediff]
       (
        @date datetime
        )
       as
      begin 
  DECLARE @diff varchar(70)
  DECLARE  @tmpdate datetime, @years int, @months int, @days int

 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 @diff=
  case
     when @years < 1 then
   concat( @months,'  Months ',@days,'  days ' )
   when @years >=1 and @years < 6
    then 
    concat(@years,'  year ', @months,'  Months ',@days,'  days ' )
 when @years >= 6  then

  concat( @years,'  years ' )
   end;
 select @diff

 end
 execute proc_datediff '1/1/2016'
  go
创建过程[dbo].[proc_datediff]
(
@日期时间
)
作为
开始
声明@diff varchar(70)
声明@tmpdate datetime、@years int、@months int、@days int
选择@tmpdate=@date
选择@years=DATEDIFF(yy,@tmpdate,GETDATE())-CASE WHEN
(月(@date)>月(GETDATE())或(月(@date)=
月(GETDATE())和日(@date)>日(GETDATE()),然后1或0结束
选择@tmpdate=DATEADD(yy、@years、@tmpdate)
选择@months=DATEDIFF(m,@tmpdate,GETDATE())-CASE WHEN
DAY(@date)>DAY(GETDATE())然后1或0结束
选择@tmpdate=DATEADD(m、@months、@tmpdate)
选择@days=DATEDIFF(d,@tmpdate,GETDATE())
选择@diff=
案例
当@years<1时
concat(@months,'months',@days,'days'))
当@years>=1且@years<6时
然后
concat(@年,@月,@月,@天,'天)
当@years>=6时
concat(@年,“年”)
结束;
选择@diff
结束
执行日期差异“1/1/2016”程序
去

可能不是最有效的方法,但我是这样做的:

我必须首先得到今天的日期和人的出生日期之间的日期差。通过将它与ABS()和余数(%)函数相结合,我使用它来获得年、月、日等

declare @year int = 365
declare @month int = 30
declare @sixYears int = 2190

select 
--CAST(DATEDIFF(mm, a.BirthDateTime,  getdate()) AS VARCHAR) as GetMonth,
--CAST(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, a.BirthDateTime, getdate()), a.BirthDateTime), getdate()) AS VARCHAR) as GetDays,

CASE 
    WHEN 
        DATEDIFF(dd,a.BirthDateTime,getdate())  < @year 
    THEN 
        cast((DATEDIFF(dd,a.BirthDateTime,getdate()) / (@month)) as varchar) +' Months & ' +
        CAST(ABS(DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, a.BirthDateTime, getdate()), a.BirthDateTime), getdate())) AS VARCHAR)
        + ' Days'
    WHEN
        DATEDIFF(dd,a.BirthDateTime,getdate()) between @year and @sixYears
    THEN
        cast((DATEDIFF(dd,a.BirthDateTime,getdate()) / (@year)) as varchar) +' Years & ' +
        CAST((DATEDIFF(mm, a.BirthDateTime,  getdate()) % (12)) AS VARCHAR) + ' Months'
    WHEN DATEDIFF(dd,a.BirthDateTime,getdate()) > @sixYears
    THEN cast(a.Age as varchar) + ' Years'

    end as FinalAGE,
declare@year int=365
声明@month int=30
声明@sixYears int=2190
挑选
--将DATEDIFF(mm,a.BirthDateTime,getdate())转换为VARCHAR)转换为GetMonth,
--将DATEDIFF(dd,DATEADD(mm,DATEDIFF(mm,a.BirthDateTime,getdate()),a.BirthDateTime),getdate()转换为VARCHAR)转换为GetDays,
案例
什么时候
DATEDIFF(dd,a.BirthDateTime,getdate())<@year
然后
将((DATEDIFF(dd,a.BirthDateTime,getdate())/(@month))转换为varchar)+“Months&”+
强制转换(ABS(DATEDIFF(dd,DATEADD(mm,DATEDIFF(mm,a.BirthDateTime,getdate()),a.BirthDateTime),getdate())为VARCHAR)
+“天”
什么时候
DATEDIFF(dd,a.BirthDateTime,getdate())介于@year和@sixYears之间
然后
将((DATEDIFF(dd,a.BirthDateTime,getdate())/(@year))转换为varchar)+“Years&”+
将((DATEDIFF(mm,a.BirthDateTime,getdate())%(12))转换为VARCHAR)+“月”
当DATEDIFF(dd,a.BirthDateTime,getdate())>@sixYears
然后施放(a.Age为varchar)+“Years”
以最后的形式结束,
dc.DayMarker=cast(getdate()作为日期)

DAYmarker是您的日期字段


请解释某人在月末出生时会发生什么情况。例如某人在3月31日出生,他们的年龄在4月30日、5月1日,等等?搔我的头。也显示月后的天数如何。这样就没有理由确定使用哪个月。我将更新我的问题。另外,你提到你想要格式MM&days。这是指“05&02”,还是您真的希望如示例所示写出它,并跳过前导的0?我将以天为单位计算两个日期之间的差值(这很简单且不含糊)然后假设一年有365.2425天,一个月有30.436875天,然后显示用户的大致年龄。这种逻辑最好在应用层中实现,不在SQL代码的范围内。这将是我给您的建议。请尝试@date1
1/1/2010
。更新您的答案。还可以尝试
02-27-2016
@sqluser谢谢你。现在太晚了。如果你选择@date1=1/28/2016,它会给你2个月和-4天。总体来说,效果很好!另外,如果你使用@date1='5/25/2015',它会给你0年和10个月,而不是MM&days格式。由于版本较旧,我无法使用concat,因此我无法验证你的查询,但给了你一个惊喜向上的