2016-12-05 4 views
1

Это может показаться очень простым/глупым вопросом, но если я буду использовать этот код в январе, будет ли выход декабрь (как в январе - 1 = декабрь)?T-SQL DATEDIFF MONTH Январь

SELECT DATENAME(MONTH, DATEDIFF(MONTH, -1, GETDATE())); 
+1

@JohnCappelletti - Более короткий ответ; *** Нет *** * (См. Два ответа ниже.) * – MatBailie

+0

Как насчет того, чтобы попробовать? 'declare @MyDate как Date = '20160115'; выберите @MyDate, DateName (месяц, DateDiff (месяц, -1, @MyDate)); '. Вы можете смешать дату и посмотреть, что вы получаете. – HABO

+0

@MatBailie Святой курит! –

ответ

2

Вы используя обе функции неправильно. Я рекомендую смотреть на интерактивной справке для получения более подробной информации, но вот объяснение того, что вы сделали ...


DATEDIFF() «s последние два параметра являются DATETIME s.

  • Он находит разницу между этими двумя датами.
  • В годы или месяцы, или дней, или часов и т.д.


Таким образом, когда вы передаете -1 в качестве первой даты, когда она неявно CAST к DATETIME.

  • Как это происходит, 0 является 1970-Jan-01 @ 00:00:00
  • Это означает, что -1 является 1969-Dec-31 @ 00:00:00.
  • Вы сделали How many months are there between 1969-Dec-31 and now?
  • Какой ток 1405 месяцев


DATENAME() «s второй параметр также является DATETIME.

  • Он возвращает название месяца для указанной даты
  • или имя дня и т.д.


Таким образом, когда вы указали 1405 в качестве параметра DATETIME, который также был неявно преобразован.

  • Это 1405 дней после 1st Jan 1970
  • Который является 6th Nov 1973
  • Так DATENAME() возвращает 'November'


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

  • DATENAME(MONTH, DATEADD(MONTH, -1, getDate()))
+0

Спасибо за подробное объяснение! Теперь я понимаю разницу между DATEADD и DATEDIFF. Вместо этого я буду использовать DATEADD. Очень ценится. –

1

Как написано, нет. На данный момент времени он вернется только November. Это связано с тем, что вы используете DATEDIFF вместо DATEADD.

Вы можете увидеть немного о том, почему он делает это, выбрав DATEDIFF часть:

SELECT DATEDIFF(MONTH, -1, '2017-01-01') 

И Select DateName(Month, 1405) возвращается November.

Но, это должно быть то, что вы имели в виду использовать:

SELECT DATENAME(MONTH, DATEADD(MONTH, -1, GETDATE())); 

И да, используя который будет возвращать December:

SELECT DATENAME(MONTH, DATEADD(MONTH, -1, '2017-01-01')); 

декабря