2015-05-29 3 views
1

Я писал запросы, чтобы урезать время из заданного времени жизни в течение многих лет, основываясь на ответах, таких как this one и this one (и многих других местах), что группы существует пара функций, таких какЗапрос на получение первого дня месяца, не работающего с DATEADD

SELECT DATEADD(day, 0, DATEDIFF(day, 0, getdate())) 

и он всегда дает правильный ответ.

Я полагал, что я мог бы перевести ту же логику для нахождения первого числа текущего месяца, используя month вместо day, но это дает мне странную дату результата: 1903-10-17, а 2015 -05-01.

ответ

0

Мои параметры всегда были в неправильном порядке.

Оказалось, что формат для DATEADD Я использую все эти годы неправильно, и он работает только потому, что использует day datepart. Кастинг Int к дате увеличивает день:

SELECT CAST(0 AS datetime) = '1900-01-01 00:00:00.000' 
SELECT CAST(1 AS datetime) = '1900-01-02 00:00:00.000' 
SELECT CAST(2 AS datetime) = '1900-01-03 00:00:00.000' 

я должен использовать DATEADD(d, DATEDIFF(d, 0, getdate()), 0) - параметры являются (DatePart, номер, дата ), как изложено here at MSDN.

Написание его как SELECT DATEADD(month, DATEDIFF(month, 0, getdate()), 0) дает ожидаемый результат от 2015-05-01.

+0

Хороший кусок наших серверов по-прежнему работает в 2005 году, поэтому я не думаю, что это сработает для нас в целом, но я еще раз взгляну на ваш пост @AaronBertrand. – Danny

+0

И вам нужно только заменить второй 'GETDATE()', а не первый. Также см. [This] (http://sqlperformance.com/2012/09/t-sql-queries/what-is-the-most-efficient-way-to-trim-time-from-datetime) и [это] (http://sqlperformance.com/2012/10/t-sql-queries/trim-time) для обсуждения вопроса об усечении времени. –

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