1
votes

Comment sélectionner les anniversaires dans les 30 prochains jours

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"


3 commentaires

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.


4 Réponses :


3
votes

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


1 commentaires

@ 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.



2
votes

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"


1 commentaires

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



0
votes

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


0 commentaires

0
votes

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"


1 commentaires

Hey Gordon Linoff, par quoi dois-je remplacer (e.date)?