В предположении, вам нужно запросить результаты предыдущего квартала, который будет просто таким запросом:
SELECT * FROM QUERY
WHERE MEID = @ID
AND mydate >= DATEADD(quarter,DATEDIFF(quarter,'20010101',@ThisDate),'20001001'),
AND mydate < DATEADD(quarter,DATEDIFF(quarter,'20010101',@ThisDate),'20010101'))
И избавиться от этого большого условия if и т. Д.
Выможет также избавиться от первого, если, если вы положите COALESCE(@ThisDate,CURRENT_TIMESTAMP)
в вышеупомянутом, где у меня в настоящее время есть @ThisDate
.
, я использую шаблон DATEADD(quarter,DATEDIFF(quarter,'20010101',@ThisDate),'20001001')
для большого количества манипуляций с датой и временем.Это позволит вам многого добиться за несколько операций.В этом случае это разница между двумя датами ('20010101','20001001'
), которая дает нам предыдущий квартал.
Вы часто встречаете шаблон DATEADD / DATEDIFF в вопросах, касающихся удаления части временииз значения даты и времени.Каноническая версия этого DATEADD(day,DATEDIFF(day,0,@Date),0)
.Но шаблон может быть в целом расширен для работы с любым из компонентов datetime.Если вы выберете month
вместо day
, вы получите полночь в начале первого числа месяца (того дня, когда вы указали)
Сложность возникает при использовании дат(вместо 0
), особенно если вы не используете одну и ту же дату для обоих расчетов.Это позволяет вам применять дополнительное смещение, которое кажется почти «свободным» - вы уже используете эту конструкцию для удаления компонента времени, тот факт, что вы можете вычислить, например, последнюю дату в квартале / месяце / и т. Д., Является бонусом.