2016-03-22 3 views
4

Есть ли способ, чтобы вычислить, сколько лет кто-то на основе сегодняшнего дня, а затем их день рождения его отображения в следующих способов:Получить разницу дат в год, месяц и дни SQL

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 
+1

Пожалуйста, объясните, что происходит, когда кто-то родился в конце месяца. Скажите, что кто-то родился 31 марта, каков его возраст 30 апреля, 1 мая и т. Д.? –

+0

* Царапины моей головы * .. Как насчет также отображения дней после месяца. Таким образом, нет оснований определять, какой месяц использовать. Я уточню свой вопрос. – NonProgrammer

+0

Также вы упомянули, что хотите формат MM и дни. Означает ли это «05 & 02» или вы действительно хотите, чтобы это было выписано, как показано в примерах, и пропустив ведущий 0? – Ralph

ответ

0

, вероятно, не самый эффективный способ пойти об этом, но вот как я это сделал:

я должен был сначала получить разницу дат между сегодняшним дату и дату рождения человека. Я использовал его, чтобы получить годы, месяцы, дни и т. Д., Объединив его с функциями ABS() и Remainder (%).

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, 
1

Это в основном то, что вы ищу:

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; 

Результат, когда пользователь меньше (<) 1 год ТОГДА показать свой возраст в ММ & дней:

enter image description here

Результат, когда пользователь больше 1 года и менее чем за 6 лет ТОГДА показать свой возраст в YY & ММ & дней:

enter image description here

Результат, когда пользователь больше 6 лет ТОГДА показать их возраст в YY:

enter image description here

+1

Попробуйте это как @ date1 '1/1/2010'. Обновлен ваш ответ. – sqluser

+0

Также попробуйте '02-27-2016' – sqluser

+0

@sqluser Спасибо за это. слишком поздно. –

1

из этого предыдущего вопроса How to calculate age in T-SQL with years, months, and days

вы можете сделать процедуру как этот

 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 
+0

Из-за более старой версии я не могу использовать concat, поэтому я не могу подтвердить ваш запрос, но дал вам толчок. – NonProgrammer

Смежные вопросы