2015-04-02 1 views

ответ

0

Если вы хотите точные цифры, это очень сложно. Сколько месяцев составляет 30 дней? Это зависит от того, в каком месяце эти дни проходят.

Но если мы сможем использовать приблизительное значение и говорим, что месяц всегда составляет 30 дней (так что год равен 360).

SELECT Id, dateStartworking, 
( 
    CAST(DATEDIFF(d, dateStartworking, getDate())/30/12 AS varchar) + ' years ' + 
    CAST(DATEDIFF(d, dateStartworking, getDate())/30 % 12 AS varchar) + ' months ' + 
    CAST(DATEDIFF(d, dateStartworking, getDate()) % 30 AS varchar) + ' days' 
) 
AS [Years of service] FROM MyData 

SQL-сервер должен работать, что dateStartWorking является действительной датой, но если это не вы, возможно, захотите попробовать и бросить его тоже:

CAST(dateStartWorking AS DateTime) 

Результат:

Id Datestartworking Diff 
----------------------------------------------------------- 
1 20150203   0 years, 1 months, 28 days 
2 20150305   0 years, 0 months, 28 days 
3 20140115   1 years, 2 months, 22 days 

Я вижу, что вы также должны использовать некоторое приближение в своих расчетах, так как разница между 1996-07-08 и 2015-04-02 составляет 19 лет 2 месяца 24 дня. С моим выше сценарием это будет: 19 лет 0 месяцев 2 дня.

Если я не ошибаюсь, это означает, что мой пример более точен, так как «фактическая» разница будет примерно 18 лет ~ 9 месяцев.

Edit, для лучшей точности:

Для немного большей точности можно использовать year = 365.242199 days и month = 30.4368499 days:

SELECT Id, dateStartworking, 
( 
    CAST(CAST(ROUND(DATEDIFF(d, dateStartworking, getDate())/365.242199, 0, 1) AS int) AS varchar) + ' years ' + 
    CAST(CAST(ROUND(DATEDIFF(d, dateStartworking, getDate())/30.4368499, 0, 1) AS int) % 12 AS varchar) + ' months ' + 
    CAST(CAST(ROUND(DATEDIFF(d, dateStartworking, getDate()) % 30.4368499, 0 ,1) AS int) AS varchar) + ' days' 
) 
AS [Years of service] FROM MyData 

Это сообщит вышеуказанную разницу (1996-07-08), как 18 years 8 months 24 days , Достаточно близко!

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