Разница в дате сервера sql, когда упоминаются только месяц и год

Учитывая 2 месяца и года. День не указан. Мне нужно рассчитать разницу между этими двумя датами в SQL. Пример столбцов в базе данных SQL-сервера.

MonthFROM    YearFROM   MonthTo  YearTO

12           2010       1        2012

Выход должен быть 14 месяцев.


person RookieAppler    schedule 12.02.2014    source источник
comment
Это не даты. Так какой результат вы на самом деле ищете?   -  person Aaron Bertrand    schedule 12.02.2014
comment
@ Аарон Бертран. Нет, это не свидания. Всего 4 столбца типов целых чисел с месяцами и годами. Хотите получить результат между теми, что 14 месяцев   -  person RookieAppler    schedule 12.02.2014
comment
На самом деле, январь 2012 года будет через 13 месяцев после декабря 2010 года, а не через 14, как вы ожидаете.   -  person Pedro Fialho    schedule 12.02.2014


Ответы (4)


SQL Fiddle из следующих:

SELECT DATEDIFF(month, 
         CONVERT(VARCHAR(19),
                 CAST(MonthFROM as varchar) + '/01/' + CAST(YearFROM as varchar),
                 101), 
         CONVERT(VARCHAR(19), 
                 CAST(MonthTo as varchar) + '/01/' + CAST(YearTO as varchar), 
                 101)) + 1 AS MonthPast
FROM MyTable;

Результат будет:

MONTHPAST
14

Фактическая разница в месяцах составляет 13, но в результате вы получили 14, как и ожидалось. Если ваш расчет был неправильным и вам действительно нужно 13, удалите + 1 из запроса.

person Linger    schedule 12.02.2014

Нехорошо хранить дату таким образом.

SELECT DATEDIFF(mm, CAST(YearFROM as varchar) + RIGHT('0' + CAST(MonthFROM as varchar), 2) + '01',
                      CAST(YearTO as varchar) + RIGHT('0' + CAST(MonthTO as varchar), 2) + '01')
person Hamlet Hakobyan    schedule 12.02.2014
comment
.Клиент хранит только месяц и год, на который действителен контракт, т.е. он упоминает июнь 2010 года по сентябрь 2012 года. Вот почему я сохраняю только месяц и год. Также при использовании вашего запроса я получаю эту ошибку Преобразование не удалось при преобразовании даты и/или времени из символьной строки. Все 4 столбца являются целыми числами. - person RookieAppler; 12.02.2014
comment
Это означает, что у вас есть неверные данные в ваших столбцах, например, значение 13 в MonthFROM. - person Hamlet Hakobyan; 12.02.2014
comment
Код @RookieAppler Гамлета в порядке. На вашем месте я бы поставил ОГРАНИЧЕНИЕ ПРОВЕРКИ на все столбцы месяца, чтобы избежать проблем. - person Pedro Fialho; 12.02.2014

Пожалуйста, попробуйте следующее, используя простую арифметику:

Select (YearTo - YearFrom) * 12 + MonthTo - MonthFrom + 1 as Difference
  from MyTable;
person Wagner DosAnjos    schedule 12.02.2014
comment
Я думаю, вам не нужно добавлять +1 к месяцу, если год и месяц совпадают, тогда это также даст разницу.. проверьте это sqlfiddle.com/#!3/770d1/2 - person Zerotoinfinity; 12.02.2014
comment
Я добавил +1 к месяцу, основываясь на информации пользователя о том, что с 2010/12 по 2012/1 есть 14 месяцев в соответствии с его требованиями. - person Wagner DosAnjos; 12.02.2014
comment
Это действительно зависит от того, что он делает с результатом. Недостаточно информации по вопросу, чтобы определить, что 14 неверно. - person Wagner DosAnjos; 13.02.2014

Если вы используете SQL Server 2012, вот быстрый способ сделать это

SELECT DATEDIFF(month, DATEFROMPARTS (YearFROM, MonthFROM, 01),
                DATEFROMPARTS (YearTO, MonthTo, 01))
FROM YourTable

Демонстрация скрипта SQL

person Zerotoinfinity    schedule 12.02.2014
comment
Обратите внимание, что ваш код возвращает 13 вместо 14 для дат, указанных в вопросе. Вероятно, вам нужно добавить +1, чтобы удовлетворить требования пользователя. - person Wagner DosAnjos; 12.02.2014