2
votes

Comment écrire une requête qui extrait des données pour chaque année le jour donné

J'ai une requête dans laquelle je dois extraire des données de réclamation pour le jour donné et renvoyer ces données pour chaque année avant ce jour donné, par exemple

J'ai une réclamation aujourd'hui: 15/01/2019

Je veux pouvoir extraire toutes les autres années dans une requête générique car ce sera une procédure stockée.

Cela me permettra de voir s'il y a des réclamations le jour donné pour l'une des dernières années.

Je suis capable de faire 1 an, 2 ans, 3 ans, le tout séparément si je devais créer une variable ou une instruction de cas, mais y a-t-il un moyen de tout faire de manière plus simple?

Voici le code d'il y a 1 an:

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


0 commentaires

3 Réponses :


2
votes

Hein? Cela devrait être beaucoup plus facile en utilisant simplement des parties de date:

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

Deux notes:

  • Méfiez-vous du 29 février.
  • Cela n'utilisera pas d'index.


3 commentaires

Ok, mais comment faire l'année bissextile parce que je ne peux pas simplement l'exclure


@TylerStevens. . . Posez une autre question et soyez explicite sur ce qu'il faut faire pour l'année bissextile. La modification de cette question semblerait la changer considérablement: "Je dois extraire des données de réclamation pour le jour donné et renvoyer ces données pour chaque année avant ce jour-là". Cela répond à la question que vous avez posée.


Merci pour votre aide et explication



1
votes

C'est donc ce que je dois gérer les années bissextiles si vous souhaitez le faire en tant que procédure stockée. Il y a peut-être un moyen plus simple, mais je n'en ai pas pensé. Vous pouvez également modifier mon paramètre d'entrée en une date flexible si vous prévoyez d'utiliser SSRS.

J'ai créé une table fictive:

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 

Ensuite, j'ai créé un processus (ajustez votre variables dont vous avez besoin affichées en conséquence):

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');

L'année bissextile renvoie ces résultats:

 entrez la description de l'image ici p >

La date d'aujourd'hui renvoie:

 entrez la description de l'image ici


0 commentaires

0
votes

cette requête fournira des données sur 3 ans

select [date] from TableName where (year([date]) = year(getdate())-1
or year([date]) = year(getdate())-2
or year([date]) = year(getdate())-3)


0 commentaires