как получить разницу между двумя датами в годах и месяцах в одном запросе, используя подзапросы? - PullRequest
0 голосов
/ 13 мая 2019

Я использую базу данных Northwind DB SQL и пытаюсь получить разницу между двумя датами в годах, причем месяцы не разделены.Пример найма сотрудника Дата 1992-05-01 должна составлять 27 лет 0 месяцев, а 1992-08-14 - 2 года 8 месяцев с использованием сегодняшнего дня в качестве даты для сравнения.Я хочу получить результаты для каждой строки таблицы с другими значениями в одном примере результата

FirstName |hireDate |hiredYears |hiredMonths nancy 1992-05-01 6 11

Это мой запрос

SELECT  months-(Age*12) FROM (

SELECT CASE WHEN dateadd(year, datediff (year, [HireDate], getdate()),[HireDate]) > getdate()
            THEN datediff(year, [HireDate], getdate()) - 1
            ELSE datediff(year, [HireDate], getdate())
       END as Age,

       (case when datepart(day,getdate()) >= datepart(day,[HireDate]) 
       then datediff(month, [HireDate], getdate())
       else datediff(month, [HireDate], dateadd(month,-1,getdate()))
       end) as months

FROM [Employees] 

) results;

Первый запрос дал мне месяцы и подзапрос в годах, но я не знаю, как создатьподзапрос, который показывает все вместе.Кроме того, я хотел бы знать, может ли этот подзапрос иметь плохую производительность, потому что я хотел бы использовать нечто подобное в таблице с большим количеством записей, любым советом или ссылкой для чтения?

Ответы [ 3 ]

2 голосов
/ 13 мая 2019

Я думаю, что правильный ответ - получить значение в месяцах, а затем выполнить арифметику:

SELECT months / 12 as years,
       month % 12 as months
FROM employees e CROSS APPLY
     (VALUES (DATEDIFF(month, hiredate, getdate())
     ) v(months);
1 голос
/ 13 мая 2019

Попробуйте это-

SELECT FirstName, 
hireDate ,
DATEDIFF(YY,hireDate ,GETDATE()) hiredYears,
DATEDIFF(MM,hireDate ,GETDATE())%12 hiredMonths
FROM your_table
1 голос
/ 13 мая 2019

Я думаю, вам просто нужно разделить месяцы на двенадцать, чтобы получить полные годы, и использовать их по модулю двенадцать, чтобы получить оставшиеся месяцы. Используйте concat(), чтобы составить строку в виде «n лет m месяцев».

SELECT concat(datediff(month, hiredate, getdate()) / 12,
              N' years ',
              datediff(month, hiredate, getdate()) % 12,
              N' months')
       FROM employees;
...