2014-12-24 5 views
2

У меня есть проблема в подсчете разницы месяца со 2 дня с запросом сервера SQLГраф месяц отличается от даты SQL SERVER

я попытался с помощью DATEDIFF(MONTH, SD, ED)

это, например

SD = '2013-12-10 00:00:00.000' 
ED = '2014-12-09 00:00:00.000' 
SELECT DATEDIFF(MONTH, SD, ED) 

--result : 12 //this correct result 


SD = '2013-12-10 00:00:00.000' 
ED = '2014-12-10 00:00:00.000' 
SELECT DATEDIFF(MONTH, SD, ED) 

--result : 12 //this incorrect result, the result that i want is 13 


SD = '2013-12-10 00:00:00.000' 
ED = '2014-12-15 00:00:00.000' 
SELECT DATEDIFF(MONTH, SD, ED) 

--result : 12 //this incorrect result, the result that i want is 13 

SD = '2013-12-01 00:00:00.000' 
ED = '2014-11-30 00:00:00.000' 
SELECT DATEDIFF(MONTH, SD, ED) 

--result : 11//this incorrect result, the result that i want is 12 

есть любое решение для получения правильного результата разницы в месяце 2 даты ?? Может кто-нибудь мне помочь?

Благодаря

+1

Определите свое видение «* правильного результата» для любых двух заданных дат. –

+0

Datediff выглядит неправильно, хотя если вы добавите месяц в ED, а затем вычтите день (или, возможно, наоборот), это может сработать. Вы можете получить более качественные ответы, если будете описывать, что хотите считать. примеры сбивают с толку и недостаточно точны, чтобы дать точный ответ. – Jasen

+0

Возможный дубликат [как получить число в месяцах между двумя датами в SQL Server 2005] (http://stackoverflow.com/questions/2054975/how-to-get-the-number-on-months-between-two -dates-in-sql-server-2005) –

ответ

5

DATEDIFF сравнивает только месяцы, независимо от даты в пределах. Как Вы желаете включить частичные месяцы, попробуйте сравнить даты, а также, и добавление CASE WHEN DATEPART(day,@d2) >= DATEPART(day,@d1) THEN 1 ELSE 0 END

Так использовать обозначение из вашего вопроса:

SELECT DATEDIFF(MONTH, SD, ED) + 
    CASE WHEN DATEPART(DAY, ED) >= DATEPART(DAY, SD) THEN 1 ELSE 0 END 
+0

То же самое, что я указал в своем редактировании, но он привел несколько других примеров и сказал, что он дает неверный результат. – Rajesh

+1

@ Rajesh Не то же самое. Этот код дает правильные ответы для всех примеров в вопросе. –

+0

Согласен с вашим ответом – Rajesh

2

DATEDIFF() работает иначе, чем многие ожидают. Из official documentation:

Возвращает количество (знаковое целое число) из указанных DATEPART границ скрещенных между указанным StartDate и EndDate.

DATEDIFF(MONTH, @startdate, @enddate) эквивалентно

(YEAR(@enddate) - YEAR(@startdate)) * 12 + (MONTH(@enddate) - MONTH(@startdate)). 

Так что для 2013-12-01 и 2014-11-30, его (2014-2013) * 12 + (11 - 12)

, который на самом деле 11. Для '2013-12-31' и '2014-11-01' также 11. Опять же, это делается таким образом, потому это единственный нейтральный по отношению к культуре и полностью последовательный способ сделать это.

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

+0

@RobFarley Нет, это глупо. Поскольку в отсутствии каких-либо умений для понимания того, что хочет пользователь, и по моему опыту, что хочет пользователь * на самом деле *, никогда не было *, что фактически делает DATEDIFF() ', но это единственная функция по умолчанию, которая выполняет эту операцию. Таким образом: * Это всегда неинтуитивно *.Он работает так по уважительной причине (функция, которая делает то, что хотят все пользователи, будет слишком сложной), но это делает ее очень ограниченной (или, как я сказал: глупо). Это не сборная конструкция. Это просто инструмент, который вы можете использовать, чтобы создать его самостоятельно. Это на самом деле необычно в SQL. –

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