2014-09-14 4 views
0
select datediff(mm, 0, getdate()) 

Эта функция возвращает результат в 1376 году, я не понимаю, о том, как это было вычисленнойSQL Server или Tsql - функции DATEDIFF и DATEADD

select dateadd(mm, datediff(mm, 0, getdate()), -1) 

Эта функция возвращает результат, как «2014-08- 31 00: 00: 00.000 ", который составляет 31 августа. Мое понимание в соответствии с датой() - мм означает месяц.

select dateadd(mm, datediff(mm, 0, getdate()), -2) 

Выход «2014-08-30 00: 00: 00.000». Это снова сбивает меня с толку, поскольку это должно было отрицать месяц на -1. Но вместо этого он делает это за день.

+0

do 'select cast (0 as datetime)' – Laurence

+0

Время в секунду для сервера sql - 1 jan 1900 – Mihai

+0

[Пожалуйста, прекратите использовать сокращенную версию] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20 /bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx). Вы не сохраняете какое-либо время, набрав ленивый способ, и вы явно не помогаете сделать самообъявление кода. Замените 'month' за' mm' и замените '' 19000101'' на '0',' '18991231'' за '-1' и' '18991230'' за' -2'. –

ответ

4

mm - месяц, но вы должны использовать «месяц». Тогда очевидно, что вы делаете.

Оператор:

select datediff(month, 0, getdate()) 

получает количество месяцев с даты 0. SQL Server хранит даты как количество дней, прошедших с 1 января 1900 г. Таким образом, эта база дата 1,376 месяцев в прошлое (как я пишу это).

Когда вы пишете:

select dateadd(month, datediff(month, 0, getdate()), -1) 

Затем вы добавляете количество месяцев с 1900-01-01 до даты со значением -1. -1 интерпретируется как datetime, что соответствует 1899-12-31. Следовательно, когда вы добавляете месяцы, вы получаете последний день предыдущего месяца. Когда вы меняете -1 на -2, вы получаете второй и последний день, потому что вы рассчитываете с 1899-12-30.

+0

Большое спасибо Гордон. Это помогло мне понять это. – user3347834

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