разлика в датата на sql сървъра, когато се споменават само месец и година

Предвид 2 месеца и години. НЕ е споменат ден. Трябва да изчисля разликата между тези две дати в SQL. Пример за колоните в SQL сървър DB.

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
@AaronBertrand. Не, не са дати. Само 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 Hamlet е ок. Ако бях на твое място, щях да сложа CHECK CONSTRAINT на всички колони за месец, за да избегна проблеми. - 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 Fiddle

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