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
3 Réponses :
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:
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
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:
La date d'aujourd'hui renvoie:
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)