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)