Код SQL для текущего месяца в прошлом году

Я использую функцию dataadd, пытаясь найти сумму, в которой определенное поле даты находится в текущем месяце, но в предыдущем году.

sum(case when (mt04 >= DATEADD(MONTH,-12,getdate()) and (mt04 <= dateadd(month,-11,getdate())))
         then 1 else 0
    end) as [New Instructions Same Month Last Year], 

Это отчет, который я использую, и на данный момент он показывает данные с этого момента и до конца месяца. Например. если я запустил его 8-го числа месяца, он показывает данные с 8-го числа текущего месяца предыдущего года. Мне нужна сумма за весь месяц предыдущего года.


person Duncan Forbes    schedule 09.07.2015    source источник


Ответы (1)


Поскольку это в sum(), нет никакого смысла помещать все вызовы функций в текущую дату. Итак, просто используйте month() и year():

sum(case when year(mt04) = year(getdate()) - 1 and month(mt04) = month(getdate())
         then 1 else 0
    end) as [New Instructions Same Month Last Year]
person Gordon Linoff    schedule 09.07.2015
comment
Поскольку это находится в сумме(), нет никакого преимущества в том, чтобы помещать все вызовы функций в текущую дату. - Это неправда, я понимаю, что вы подразумеваете в отношении того, что это не влияет на sargability запроса, однако вы по-прежнему выполняете функции в столбце даты для каждой строки, а не один раз во время компиляции, чтобы получить постоянную дату. В некоторых быстрых тестах, которые я провел, я обнаружил, что использование функций на дату, а не на GETDATE(), примерно на 25% дороже. - person GarethD; 09.07.2015
comment
@ГаретД. . . Это большая разница. Я ожидал, что время загрузки данных с диска перегрузит вызов двух функций как минимум на порядок, если не больше. - person Gordon Linoff; 09.07.2015
comment
В таблице, на которой я провел тест, было около 25 миллионов записей, и сумма постоянно занимала около 2 секунд (в теплом кеше) с использованием SUM(CASE WHEN DateColumn >= '20150701' AND DateColumn < '20150801' THEN 1 ELSE 0) по сравнению с 2 с половиной секундами с использованием DATEPART(YEAR, DateColumn) = 2015 AND DATEPART(MONTH, DateColumn) = 7. Я понимаю, что выполнение суммы по 25 миллионам записей может быть стандартный сценарий и на меньшем наборе данных разница, вероятно, будет незначительной. - person GarethD; 10.07.2015