Найти все записи на основе четверти - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть таблица с названием Аварии.Я пытаюсь вернуть все записи, основываясь на том, в каком квартале находится отчетная дата. Вот как выглядит таблица:

Accidents Table

| acc_id  | acc_descrip |reported_date|
| 1       | collision   |2019-20-01
| 2       | hit and run |2019-08-01
| 3       | collision   |2019-10-06

Так что это работает с точки зрения предоставления мне всех записей в таблице иквартал и год, в который они попадают. Но я хочу передать только параметр года и получить результаты того года рекордов и квартала, в который он попадает?

alter PROCEDURE AccidentByQuarter
AS
BEGIN
SELECT *,
CASE
WHEN MONTH(ReportedDate) IN (1,2,3)  THEN convert(char(4), YEAR(ReportedDate) - 1) + 'Q3'
WHEN MONTH(ReportedDate) IN (4,5,6)  THEN convert(char(4), YEAR(ReportedDate) - 1) + 'Q4'
WHEN MONTH(ReportedDate) IN (7,8,9)  THEN convert(char(4), YEAR(ReportedDate) - 0) + 'Q1'
WHEN MONTH(ReportedDate) IN (10,11,12) THEN convert(char(4), YEAR(ReportedDate) - 0) + 'Q2'
END AS Quarter  FROM Incident
END

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Вот еще одно возможное решение.

Этот запрос динамически вычисляет даты начала и окончания квартала для данного параметра @ReportedDate.Следовательно, он будет использовать индекс для столбца ReportedDate, так как в левой части операторов сравнения не происходит вычислений.

ALTER PROCEDURE AccidentByMonth (@ReportedDate int)
AS
BEGIN
    SELECT * 
    FROM Incident 
    WHERE 
        ReportedDate >= DATEADD(q, DATEDIFF(q, 0, @ReportedDate), 0) 
        AND ReportedDate < DATEADD(d, -1, DATEADD(q, DATEDIFF(q, 0, @ReportedDate) + 1, 0)) 
END
0 голосов
/ 08 февраля 2019

Вы должны попробовать это.В соответствии с именем вашего параметра @ReportDate я предполагаю, что это число в виде целого числа (20190207 = 2019-02-07).Я использую функцию CONVERT, потому что ваш параметр функции INT.

ALTER PROCEDURE AccidentByMonth
    (
        @ReportedDate int
    )
AS
    BEGIN
        SELECT *
        FROM   Incident
        WHERE  DATEPART(QUARTER, ReportedDate) = DATEPART(QUARTER, CONVERT(DATE,CONVERT(VARCHAR(10),@ReportedDate,101)));
    END;
0 голосов
/ 08 февраля 2019

Если производительность не является большой проблемой, я бы сделал:

alter procedure AccidentByMonth (
    @ReportedDate int
)
AS
Begin
    select *
    from Incident
    where month(ReportedDate) / 4 = @ReportedDate / 4
End;

Это немного загадочно - потому что значения начинаются с 1, а не с 0. Возможно, это более читабельно:

    where (month(ReportedDate) - 1) / 4 = (@ReportedDate - 1) / 4

Или:

   where datepart(quarter, RepertedDate) = (@ReportedDate - 1) / 4
...