На работе появилась задача — посчитать рабочее время в таблице сотрудников, зная дату приёма на работу. Мы для внутренней доки используем Confluence поэтому делать было решено тоже там.

У нас стоит плагин Table Filter & Charts for Confluence, который позволяет взять таблицу в статье и работать с ней через SQL. В плагине используется какой-то проклятый AlaSQL, который по синтаксису похож на TSQL. С помощью плагина я из таблицы сотрудников собираю новую с 4 столбцами: номером, фио, должностью и стажем.

Ну и вот. Всё было хорошо, я нашёл в интернете похожий код, воткнул… и понял что TSQL почему-то считает, что если сотрудник пришёл 11.03.22, а сейчас 03.03.24 то разница между ними 24 МЕСЯЦА. В результате, количество дней отличалось на 1 месяц и получалось -6 вместо 24.

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

В общем, вот мой код, вдруг пригодиться :). Само собой, SQL я не знаю и вообще не программист, поэтому можете написать как его улучшить в комментариях.

SELECT '#','ФИО', 'Должность',
CONCAT
(
 DATEDIFF(YEAR, 'Прием на работу', GETDATE()), " лет, ",
FLOOR(floor(DATEDIFF(DAY, 'Прием на работу', GETDATE())/30.4375) - (DATEDIFF(YEAR, 'Прием на работу', GETDATE()) * 12)), " месяцев, ",
FLOOR(DATEDIFF(DAY, 'Прием на работу', GETDATE()) - 
365*FLOOR(DATEDIFF(YEAR, 'Прием на работу', GETDATE())) - 
30.4375*FLOOR(floor(DATEDIFF(DAY, 'Прием на работу', GETDATE())/30.44)-DATEDIFF(YEAR, 'Прием на работу', GETDATE()) * 12)), " дней"
)
AS 'Стаж' FROM T1;