Параметр SQL, который проверяет фильтры записей, возвращенных в течение последних 3, 6, 9 месяцев или года

Я пытаюсь написать хранимую процедуру, которая возвращает данные только за последние 3, 6, 9 месяцев или год. Это должно быть только полные месяцы (если потянет 8/15; последний будет июль)

До сих пор я был в состоянии узнать, как узнать 1-й и последний день предыдущего месяца.

SELECT DATEADD(m,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0))as 'First day of the month',
DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)) as 'Last day of the month'

Поле, которое нужно проверить, - TransactionDateKey (т. Е. 20161222). Я думаю, что я должен использовать CAST в этом поле, чтобы проверять только месяц и день (например, 201612), но я могу ошибаться. Ниже приведен примерный макет того, что, по моему мнению, должно основываться на моем запросе, но без жестко закодированных дат.

select FirstName + ' ' + LastName as 'Specialist',
    empID as 'empID',
    count(fact.spKey) as 'Count',
    CAST(LEFT(CAST(TransactionDateKey AS VARCHAR(100)), 6) AS INT) as 'Month'
from Final.DimSpecialist s
    inner join Final.FactTreatmentDay fact
        on fact.spKey = s.spKey
where TransactionDateKey between 20161201 and 20161231
group by FirstName + ' ' + LastName,
    empID,
    CAST(LEFT(CAST(TransactionDateKey AS VARCHAR(100)), 6) AS INT)

Как мне объявить один параметр @MonthRange и использовать его в предложении WHERE для возврата данных только за последние 3 месяца, 6 месяцев, 9 месяцев или год? Я думаю, что параметр нужно будет поместить туда, где -1 в "Первый день месяца". Я думаю, что также должна быть инструкция case, чтобы проверить каждое из 4 возможных значений параметра, но я не уверен, куда он должен идти. Любые советы будут высоко ценится.

1 ответ

Решение

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

declare @months_to_report int;  --procedure parameter

--Validation
if @months_to_report not in (3, 6, 9, 12) raiserror('Months to report must be one of 3, 6, 9, or 12.', 18, 1);

--Variables
declare @first date, @start date, @end date, @start_key int, @end_key int;

set @first = DATEADD(m,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0));     --first day of previous month
set @end = DATEADD(d,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0));        --last day of previous month
set @start = DATEADD(M, 1 - @months_to_report, @first);                 --move back n-1 months to account for including previous month

set @start_key = Year(@start) * 10000 + Month(@start) * 100 + Day(@start);  --start date as keys
set @end_key = Year(@end) * 10000 + Month(@end) * 100 + Day(@end);  --end date as keys

select @first as 'First day of the month', @start as 'First day of reporting period', @end as 'Last day of the month/reporting period', @start_key as 'Start key', @end_key as 'End key';

Этот код предполагает, что передаваемый параметр @months_to_report, Я предпочитаю проверять параметры в хранимых процедурах. Конец select только для целей отладки. Вы должны изменить предоставленный пример кода, чтобы следовать этому, и дополнить @start_key и @end_key для жестко запрограммированных дат.

Другие вопросы по тегам