28 Stimmen

SQL Select Kommende Geburtstage

Ich versuche, eine gespeicherte Prozedur zu schreiben, um Mitarbeiter auszuwählen, die bevorstehende Geburtstage haben.

SELECT * FROM Employees WHERE Birthday > @Today AND Birthday < @Today + @NumDays

Das wird nicht funktionieren, weil das Geburtsjahr Teil des Geburtstags ist. Wenn ich also am 18.09.1983 Geburtstag hatte, liegt das nicht zwischen dem 18.09.2008 und dem 25.09.2008.

Gibt es eine Möglichkeit, den Jahresanteil von Datumsfeldern zu ignorieren und nur Monat/Tage zu vergleichen?

Dies wird jeden Montagmorgen durchgeführt, um die Manager auf bevorstehende Geburtstage aufmerksam zu machen, so dass es möglicherweise den Jahreswechsel überspannen wird.

Hier ist die funktionierende Lösung, die ich schließlich erstellt habe, danke Kogus.

SELECT * FROM Employees 
WHERE Cast(DATEDIFF(dd, birthdt, getDate()) / 365.25 as int)
    - Cast(DATEDIFF(dd, birthdt, futureDate) / 365.25 as int) 
<> 0

39voto

JosephStyons Punkte 55410

Hinweis: Ich habe diesen Artikel überarbeitet, um einen meiner Meinung nach bedeutenden Fehler zu beheben. Die jetzt veröffentlichte Version funktioniert bei mir.

Dies sollte funktionieren, nachdem Sie die Feld- und Tabellennamen so geändert haben, dass sie mit Ihrer Datenbank übereinstimmen.

SELECT 
  BRTHDATE AS BIRTHDAY
 ,FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()) / 365.25) AS AGE_NOW
 ,FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()+7) / 365.25) AS AGE_ONE_WEEK_FROM_NOW
FROM 
  "Database name".dbo.EMPLOYEES EMP
WHERE 1 = (FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()+7) / 365.25))
          -
          (FLOOR(DATEDIFF(dd,EMP.BRTHDATE,GETDATE()) / 365.25))

Im Grunde genommen wird die Anzahl der Tage zwischen dem Geburtstag und dem jetzigen Zeitpunkt ermittelt und durch 365 geteilt (um Rundungsprobleme zu vermeiden, die bei einer direkten Umrechnung in Jahre auftreten).

Dann wird die Anzahl der Tage zwischen dem Geburtstag und der nächsten Woche ermittelt und durch 365 geteilt, um das Alter in der nächsten Woche zu ermitteln.

Wenn ihr Geburtstag innerhalb einer Woche liegt, ist die Differenz zwischen diesen beiden Werten 1. Es werden also alle diese Datensätze zurückgegeben.

17voto

Andres SK Punkte 10479

Für den Fall, dass jemand noch nach einer Lösung sucht in MySQL (leicht abweichende Befehle), hier ist die Abfrage:

SELECT
 name,birthday,
 FLOOR(DATEDIFF(DATE(NOW()),birthday) / 365.25) AS age_now,
 FLOOR(DATEDIFF(DATE_ADD(DATE(NOW()),INTERVAL 30 DAY),birthday) / 365.25) AS age_future

FROM user

WHERE 1 = (FLOOR(DATEDIFF(DATE_ADD(DATE(NOW()),INTERVAL 30 DAY),birthday) / 365.25)) - (FLOOR(DATEDIFF(DATE(NOW()),birthday) / 365.25))

ORDER BY MONTH(birthday),DAY(birthday)

11voto

Philippe Grondier Punkte 10636

Beste Verwendung von datediff und dateadd. Keine Rundung, keine Näherungswerte, kein 29. Februar-Fehler, nichts als Datumsfunktionen

  1. ageOfThePerson = DATEDIFF(yyyy,dateOfBirth, GETDATE())

  2. dateOfNextBirthday = DATEADD(yyyy,ageOfThePerson + 1, dateOfBirth)

  3. daysBeforeBirthday = DATEDIFF(d,GETDATE(), dateofNextBirthday)

Dank @Gustavo Cardoso, neue Definition für das Alter der Person

  1. ageOfThePerson = FLOOR(DATEDIFF(d,dateOfBirth, GETDATE())/365.25)

4voto

Edyn Punkte 2200

Der Ansatz von @strelc hat mir gut gefallen, aber sein Sql war ein bisschen daneben. Hier ist eine aktualisierte Version, die gut funktioniert und einfach zu bedienen ist:

SELECT * FROM User 
WHERE (DATEDIFF(dd, getdate(), DATEADD(yyyy, 
    DATEDIFF(yyyy, birthdate, getdate()) + 1, birthdate)) + 1) % 366 <= <number of days>

edit 10/2017: einzelnen Tag am Ende hinzufügen

2voto

Nick Berardi Punkte 53415

Entschuldigung, ich habe die Anforderung, das Jahr zu neutralisieren, nicht gesehen.

select * from Employees
where DATEADD (year, DatePart(year, getdate()) - DatePart(year, Birthday), Birthday)
      between convert(datetime, getdate(), 101) 
              and convert(datetime, DateAdd(day, 5, getdate()), 101)

Das sollte funktionieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X