declare @29Feb datetime = convert(datetime,'2012/02/29')
declare @28Feb datetime = convert(datetime,'2012/02/28')
select case when
dateadd(yy,-1,@29Feb) = dateadd(yy,-1,@28Feb)
then 1
else 0 end
Этот оператор выбора выводит 1, так что на самом деле даты 29 и 28 февраля имеют только одну соответствующую дату в прошлом году, 28 февраля.
Теперь вы делаете сумму за два периода в разные годы, для которых случается, что первый период на 1 день меньше текущего периода.
Как бы кто-то ответил на следующий вопрос:
"How many accounts have been created in the last year's February and how many this year?"
Имеет ли значение тот факт, что в одном феврале было 28 дней, а в другом 29? Я не верю, что это февраль, а не дни.
Итак, я вижу две проблемы с этим запросом:
- В этом году может быть день, когда учетные записи не были созданы, но в прошлом году, за тот же период, некоторые учетные записи создавались, поэтому левое объединение не перехватывает учетные записи в прошлом году
- Для этого года для двух разных дат 28 и 29 соответствуют только одному дню, 28, поэтому эта сумма суммируется дважды.
SELECT (SUM(b.AccountsCreatedThisYear)
FROM Report2011.dbo.T_Report_01 WITH (NOLOCK) --This year
WHERE Date_Rep BETWEEN @StartDate and @EndDate ) as AccountsCreatedThisYearTot,
(SUM(b.AccountsCreatedThisYear)
FROM Report2011.dbo.T_Report_01 WITH (NOLOCK) -- Last Year
WHERE Date_Rep BETWEEN DATEADD(year, -1,@StartDate) AND DATEADD(year, -1,@EndDate)) as AccountsCreatedLastYearTot