Как написать запрос, который извлекает данные за каждый год в данный день - PullRequest
0 голосов
/ 16 января 2019

У меня есть запрос, в котором мне нужно получить данные о претензиях за данный день и вернуть эти данные за каждый год до этого дня, например,

У меня сегодня претензия: 1/15/2019

Я хочу иметь возможность использовать все остальные годы в одном универсальном запросе, поскольку это будет хранимая процедура.

Это позволит мне увидеть, есть ли претензии в данный день за какой-либо из прошлых лет.

Я могу сделать 1 год, 2 года, 3 года, все отдельно, если бы я должен был создать переменную или регистр, но есть ли способ сделать все это более простым способом?

Вот код для 1 года назад:

SELECT * FROM tblClaim c
WHERE c.IncidentDate = DATEadd(year, -1, CAST(FLOOR( CAST(GETDATE() AS FLOAT)) AS DATETIME)) AND c.StatusID = 2

Ответы [ 3 ]

0 голосов
/ 16 января 2019

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

Я создал макет таблицы:

CREATE TABLE #tblClaim (statusid INT, incidentdate DATE)
INSERT INTO #tblClaim (statusid, incidentdate)
VALUES (1,'2019-01-15'),(2,'2019-01-15'),(1,'2018-01-15'),(2,'2018-01-15'),
       (1,'2017-01-15'),(2,'2016-01-15'),(1,'2012-02-29'),(2,'2012-02-29'),
       (1,'2016-02-29'),(2,'2016-02-29'),(1,'2008-02-29'),(2,'2008-02-29'),
       (1,'2012-02-28'),(2,'2012-02-28'),(1,'2016-03-01'),(2,'2016-03-01'),
       (1,'2008-03-01'),(2,'2008-02-28');

Затем я создал процедуру (отрегулируйте ваши переменные, которые должны отображаться соответственно):

CREATE PROC dbo.myproc as

DECLARE @leapyear INT = 229
DECLARE @date DATE = GETDATE()
--DECLARE @date DATE = '20160229'   <---used to test leap year

IF DAY(@date) + (MONTH(@date)*100) = @leapyear
BEGIN

    DECLARE @day    INT = 1
    DECLARE @month  INT = 3
    DECLARE @day1   INT = 28
    DECLARE @month1 INT = 2;

    WITH CTE (statusid, incidentdate)
    AS

        (
        SELECT * 
        FROM #tblClaim
        WHERE statusid = 2
            AND DAY(incidentdate)   = @day 
            AND MONTH(incidentdate) = @month
    UNION ALL
        SELECT * 
        FROM #tblClaim
        WHERE statusid = 2
            AND DAY(incidentdate)   = @day1 
            AND MONTH(incidentdate) = @month1
    UNION ALL 
        SELECT * 
        FROM #tblClaim
        WHERE statusid = 2
            AND DAY(incidentdate)   = DAY(@date) 
            AND MONTH(incidentdate) = MONTH(@date))
    SELECT * FROM CTE

END 
ELSE BEGIN

    SELECT * 
    FROM #tblClaim
    WHERE statusid = 2 
        AND DAY(incidentdate)   = DAY(@date)
        AND MONTH(incidentdate) = MONTH(@date)

END 

високосный год возвращает эти результаты:

enter image description here

Сегодняшняя дата возвращается:

enter image description here

0 голосов
/ 16 января 2019

этот запрос предоставит данные за 3 года

select [date] from TableName where (year([date]) = year(getdate())-1
or year([date]) = year(getdate())-2
or year([date]) = year(getdate())-3)
0 голосов
/ 16 января 2019

А? Это должно быть намного проще, просто используя части даты:

SELECT c.* 
FROM tblClaim c
WHERE c.StatusID = 2 AND
      DAY(c.IncidentDate) = DAY(GETDATE()) AND
      MONTH(c.IncidentDate) = MONTH(GETDATE());

Две ноты:

  • Остерегайтесь 29 февраля.
  • Индекс не будет использоваться.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...