2015-05-12 2 views
0

Когда я запускаю этот запрос, кажется, он отлично работает, когда я запускаю его против даты 2015-4-11. Однако, если я запрашиваю последние 3 дня, он возвращает значения в год, месяц и неделю как то же самое. День точный, но он, похоже, не правильно добавляет все остальное.DATEADD не работает в течение последних 30 дней

declare @today date = '2015-1-1' 
    select 
     [Day Total] = sum(case when [AccountingDate] < dateadd(DAY, 1, @today) then [Amount] else 0 end), 
     [Week Total] = sum(case when [AccountingDate] < dateadd(WEEK, 1, @today) then [Amount] else 0 end), 
     [Month Total] = sum(case when [AccountingDate] < dateadd(MONTH, 1, @today) then [Amount] else 0 end), 
     [Year Total] = sum([Amount]) 
    from 
     [Accounting].[dbo].[HandPay] 
    where 
     [AccountingDate] >= @today and [AccountingDate] < dateadd(year, 1, @today); 
+0

Является ли ваш '' AccountingDate' значение date' или 'DATETIME'? –

+0

AccountingDate - это дата и время, когда произошло событие. В таблице есть столбец «Дата» и столбец «Учетная дата». Оба имеют дату и время в них. – Brian

+1

Какой сервер баз данных вы используете? –

ответ

1

Когда вы используете последнюю дату, вы ищете значения, где [AccountingDate] меньше, чем-то в будущем.

Если вы добавляете в день/неделю/месяц Сегодня, то все данные будут до тех дат, если у вас есть будущие данные в вашей таблице:

declare @today date = '2015-05-12' 
    SELECT dateadd(DAY, 1, @today) 
      ,dateadd(week, 1, @today) 
      ,dateadd(month, 1, @today) 

Возвраты: 2015-05-13, 2015-05-19, 2015-06-12

Так [AccountingDate] всегда меньше, чем эти даты, если ваша таблица имеет данные только сегодня.

Если вы действительно хотите, чтобы агрегировать с сегодняшнего дня до 1 дня назад, 1 неделю назад, и 1 месяц назад, вам нужно использовать -1 в вашем DATEADD(), используйте > и изменить ваши WHERE критерии, что-то вроде:

declare @today date = '2015-1-1' 
    select 
     [Day Total] = sum(case when [AccountingDate] > dateadd(DAY, -1, @today) then [Amount] else 0 end), 
     [Week Total] = sum(case when [AccountingDate] > dateadd(WEEK, -1, @today) then [Amount] else 0 end), 
     [Month Total] = sum(case when [AccountingDate] > dateadd(MONTH, -1, @today) then [Amount] else 0 end), 
     [Year Total] = sum([Amount]) 
from 
     [Accounting].[dbo].[HandPay] 
where 
     [AccountingDate] <= @today and [AccountingDate] > dateadd(MONTH, -1, @today); 

Примечание: При сравнении DATETIME к DATE в любое время после полуночи будет считаться больше, чем значение DATE, так что вы хотите, чтобы убедиться, что вы не исключая значения, либо путем литья DATETIME в DATE или обеспечение вы правильно учли диапазон, то есть: < завтрашней DATE вместо < = сегодняшних DATE включать записи с сегодняшнего дня, которые имеют время после 00:00:00.000

+0

Спасибо, я сделал еще несколько твиков, и ваше руководство привлекло меня! – Brian

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