Как сравнить все строки VARCHAR к DateTime, и разница выхода в годы, месяцы, дни
У меня есть эта база данных модели в SQL Server 2008 R2.
Запрос
Я хочу показать годы, месяцы, дни службы в моей компании, как показано ниже.
Как сравнить все строки VARCHAR к DateTime, и разница выхода в годы, месяцы, дни
У меня есть эта база данных модели в SQL Server 2008 R2.
Запрос
Я хочу показать годы, месяцы, дни службы в моей компании, как показано ниже.
Если вы хотите точные цифры, это очень сложно. Сколько месяцев составляет 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
, Достаточно близко!