1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| -- Suppression des lignes entre 18 et 60 mois, excepté le dernier jour de chaque mois
WITH
-- N1 fait 2 lignes
N1 AS(SELECT 0 AS a UNION ALL SELECT 0)
-- N2 fait le carré de N1, donc 4 lignes
, N2 AS(SELECT A.a FROM N1 AS A CROSS JOIN N1 AS B)
-- N3 fait le carré de N2, donc 16 lignes
, N3 AS(SELECT A.a FROM N2 AS A CROSS JOIN N2 AS B)
-- N4 fait le carré de N3, donc 256 lignes
, N4 AS(SELECT A.a FROM N3 AS A CROSS JOIN N3 AS B)
-- N sort une liste numéroté de 1 à 256 avec le premier jour du mois (courant)
, N AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n
, DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) AS premier_jour_du_mois_courant
FROM N4
)
-- A_SUPPRIMER sort une liste numéroté de 1 à 256 avec le premier jour du mois (courant) et le début dernier jour du mois considéré
, A_SUPPRIMER AS
(
-- Cette ligne là change
SELECT DATEADD(month, -n-1, premier_jour_du_mois_courant) premier_jour_du_mois
, DATEADD(day, -1, DATEADD(month, -n, premier_jour_du_mois_courant)) AS avant_dernier_jour_du_mois
FROM N
WHERE n BETWEEN 18 AND 60
)
DELETE FROM dbo.historique
FROM dbo.historique AS H
INNER JOIN A_SUPPRIMER AS A
ON H.mydate BETWEEN A.premier_jour_du_mois AND A.avant_dernier_jour_du_mois |
Partager