2016-01-28 6 views
1

Хорошо, так вот, казалось бы, очевидный вопрос, но я просто не следуя полностью ...Как SQL Server вычисляет функцию DATEDIFF?

Я побежал следующий код на кучу дат:

SELECT 
    DATEDIFF(DAY, Start, [End]) AS DIFD, 
    DATEDIFF(WEEK, Start, [End]) AS DIFW, 
    DATEDIFF(Month, Start, [End]) AS DIFM, 
    DATEDIFF(Year, Start, [End]) AS DIFY 
FROM 
    Datetest 

И вот результат, который я Наблюдение:

Start  End   Description DIFD DIFW DIFM DIFY 
2010-03-25 2011-03-25 Normal Year  365  52  12  1 
2011-03-25 2012-03-25 Leap Year  366  53  12  1 
2010-03-24 2011-03-25 Add 1 day  366  52  12  1 
2010-03-24 2011-03-26 Add 2 day  367  52  12  1 
2010-03-24 2011-03-27 3 days   368  53  12  1 
2010-03-24 2011-03-28 4 days   369  53  12  1 
2010-03-24 2011-03-29 5 days   370  53  12  1 
2010-03-24 2011-03-30 6 days   371  53  12  1 
2010-03-24 2011-03-31 7 days   372  53  12  1 

Таким образом, единственное, что имеет смысл здесь, - это разница по дате.

Как это было в течение недель, ему не удалось распознать високосный год в 366 дней и классифицировать его как 53 недели, но затем пошли дальше и классифицировали 3-ю запись как только 52 недели, когда есть такое же количество дней?

Аналогичным образом, я не понимаю месяц и год. Я думал, что с третьего альбома он будет округлять до 13 месяцев или 2 года?

+0

Вы пробовали вручную подсчитывать фактические даты? –

+2

Прочитайте раздел границ раздела date на странице https://msdn.microsoft.com/en-us/library/ms189794%28v=sql.110%29.aspx – Munir

+0

Округление может показаться естественным для этих примеров в вашем предполагаемом использовании, но вы действительно, хотите, например, разницу в годовом исчислении между «2016-03-24» и «2016-03-25», чтобы быть 1 год по той же логике? – shawnt00

ответ

5

DATEDIFF

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

Ключевое слово здесь - «границы».

Граница недели зависит от настроек сервера (неделя может начинаться в воскресенье или понедельник или в любой другой день). См. SET DATEFIRST

Граница в течение месяцев - это 1-й день месяца, граница в течение многих лет - 1 января.

Например, как

DATEDIFF(Year, '2010-03-24', '2011-03-24') 
DATEDIFF(Year, '2010-01-01', '2011-12-31') 

будет возвращать 1, потому что есть только один 1 января между двумя диапазонами дат выше.

4

Функция DATEDIFF не вычисляет точное число, а затем округляет. Он считает границы пересеченными. Например, DATEDIFF(YEAR, '2016-01-01', '2016-12-31') на самом деле будет 0.

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