J'ai un tableau avec les dates de naissance et je souhaite sélectionner tous les anniversaires qui viendront dans les 30 prochains jours.
La situation est que tous les anniversaires sont écrits sous la forme 1999-09-15, ce qui signifie que même si j'essayais de sélectionner les 30 prochains jours, les anniversaires ne s'afficheraient pas car l'année est 1999. p>
J'utilise Microsoft Server 2016.
SELECT * from dbo.EMPLOYEES WHERE DATE <= DATEADD(day, +30,GETDATE()) and DATE >= getdate() order by "DATE"
4 Réponses :
Pour obtenir la date de naissance, nous devons travailler uniquement sur les jours et les mois, pas sur l'année. C'est pourquoi nous ne pouvons pas obtenir la date Where entre 2 dates.
SELECT
dateofbirth_c AS BIRTHDAY
,FLOOR(DATEDIFF(dd,EMP.dateofbirth_c,GETDATE()) / 365.25) AS AGE_NOW
,FLOOR(DATEDIFF(dd,EMP.dateofbirth_c,GETDATE()+30) / 365.25) AS AGE_30_Days_FROM_NOW
FROM
Employees EMP
WHERE 1 = (FLOOR(DATEDIFF(dd,EMP.dateofbirth_c,GETDATE()+30) / 365.25))
-
(FLOOR(DATEDIFF(dd,EMP.dateofbirth_c,GETDATE()) / 365.25))
@ ti60r. . . Diviser par 365,25 ne semble pas juste pour un problème comme celui-ci. Je soupçonne que cela revient parfois 30 jours et parfois 29 ou 31 jours.
Essayez ce qui suit; vérifiez le mois et le jour car l'année ne correspondra pas à l'année d'anniversaire, c'est pourquoi vous n'obtenez aucune donnée.
SELECT * from dbo.EMPLOYEES WHERE month(DATE)>= month(GETDATE()) and day(DATE) >= day (getdate()) and day(DATE) < = day( getdate()) + 30 order by "DATE"
Cela ne donne pas de résultats précis. disons que nous avons la date 1990-11-23, il sort avec ma requête; Cependant, ce n'est pas vrai; OU la date 2000-01-01 lors de l'exécution de ce script le 2019-12-31 il n'apparaîtra pas
essayez ceci
SELECT *
FROM dbo.EMPLOYEES
WHERE DATEFROMPARTS(YEAR(GETDATE()) , MONTH(Date), DAY(Date)) >= GETDATE()
AND DATEFROMPARTS(YEAR(GETDATE()) , MONTH(Date), DAY(Date)) <= DATEADD(day, +30, GETDATE())
ORDER BY Date
Si vous voulez un résultat précis qui fonctionne pendant des années bissextiles et ainsi de suite, alors:
SELECT e.*
FROM dbo.EMPLOYEES e CROSS APPLY
(VALUES (DATEFROMPARTS(YEAR(GETDATE()),
MONTH(e.date),
DAY(e.date)
)
)
) v(this_year_date)
WHERE DATEDIFF(day, GETDATE(), this_year_date) BETWEEN 0 AND 29 OR
DATEDIFF(day, GETDATE(), DATEADD(year, 1, this_year_date)) BETWEEN 0 AND 29
order by "DATE"
Hey Gordon Linoff, par quoi dois-je remplacer (e.date)?
Cher nouvel utilisateur, Bienvenue dans StackOverflow. Veuillez lire les instructions sur "Comment poser une question sur StackOverflow?" . Veuillez nous donner vos efforts jusqu'à présent, les données, le résultat souhaité et tout ce dont nous avons besoin pour reproduire votre problème.
Étant donné que 1999 n'est pas une année bissextile, comment sont enregistrées les personnes nées le 29 février?
@BarneyL c'est une question intéressante. Je n'y ai pas pensé car il n'y a pas d'employé né le 29 février inscrit dans le tableau.