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

0voto

Select Geburtsdatum,Name from Mitarbeiter order by Fall WHEN convert(nvarchar(5),BirthDate,101) > convert(nvarchar(5),GETDATE(),101) then 2 WHEN convert(nvarchar(5),Geburtsdatum,101) < convert(nvarchar(5),GETDATE(),101) then 3 WHEN convert(nvarchar(5),BirthDate,101) = convert(nvarchar(5),GETDATE(),101) then 1 else 4 end ,convert(nvarchar(2),BirthDate,101),convert(nvarchar(2),BirthDate,105)

0voto

ButterDog Punkte 4915

Ich habe dies für MySQL wahrscheinlich nicht die effizienteste Art der Abfrage, aber einfach genug zu implementieren.

select * from `schema`.`table` where date_format(birthday,'%m%d') >= date_format(now(),'%m%d') and date_format(birthday,'%m%d') < date_format(DATE_ADD(NOW(), INTERVAL 5 DAY),'%m%d');

0voto

smoothware Punkte 816

Lösung für SQLite3 :

SELECT
    *, 
    strftime('%j', birthday) - strftime('%j', 'now') AS days_remaining
FROM
    person
WHERE :n_days >= CASE
    WHEN days_remaining >= 0 THEN days_remaining
    ELSE days_remaining + strftime('%j', strftime('%Y-12-31', 'now'))
    END
;

Die Lösungen, bei denen das Alter durch 325,25 geteilt wird, oder das Geburtsdatum auf das aktuelle Jahr gebracht wird, haben bei mir nicht funktioniert. Hier wird das Delta zwischen den beiden Tagen des Jahres (1-366) berechnet. Wenn der Geburtstag in diesem Jahr noch nicht stattgefunden hat, erhält man automatisch die korrekte Anzahl der verbleibenden Tage, mit der man dann vergleichen kann. Wenn der Geburtstag bereits stattgefunden hat, ist remaining_days negativ, und Sie können die korrekte Anzahl der verbleibenden Tage ermitteln, indem Sie die Gesamtzahl der Tage im aktuellen Jahr addieren. Damit werden auch Schaltjahre korrekt behandelt, da in diesem Fall der zusätzliche Tag ebenfalls addiert wird (durch Verwendung von dayOfYear(Dec 31.))

0voto

RoMEoMusTDiE Punkte 4674

Ich glaube, dieses Ticket wurde vor Ewigkeiten geschlossen, aber um die korrekte Sql-Abfrage zu erhalten, schauen Sie bitte nach.

SELECT Employee_Name, DATE_OF_BIRTH
FROM Hr_table 
WHERE 

/**
fetching the original birth_date and replacing the birth year to the current but have to  deduct 7 days to adjust jan 1-7 birthdate.
**/

datediff(d,getdate(),DATEADD(year,datediff(year,DATEADD(d,-7,hr.DATE_OF_BIRTH),getdate()),hr.date_of_birth)) between 0 and 7

-- current date looks ahead to 7 days for upcoming modified year birth date.

order by

-- sort by no of days before the birthday
datediff(d,getdate(),DATEADD(year,datediff(year,DATEADD(d,-7,hr.DATE_OF_BIRTH),getdate()),hr.date_of_birth))

0voto

Paresh Patel Punkte 1

Die folgende Abfrage wird alle nächsten Geburtstage der Mitarbeiter zurückgeben, es ist die kürzeste Abfrage.

SELECT 
    Employee.DOB,
    DATEADD(
                mm, 
                (
                    (
                        (
                            (
                                DATEPART(yyyy, getdate())-DATEPART(yyyy, Employee.DOB )
                            )
                            +
                            (
                                1-
                                (
                                    ((DATEPART(mm, Employee.DOB)*100)+DATEPART(dd, Employee.DOB))
                                    /
                                    ((DATEPART(mm, getdate())*100) + DATEPART(dd, getdate()))
                                )
                            )
                        )
                    *12
                    )
                ), 
                Employee.DOB
            ) NextDOB
FROM 
    Employee 
ORDER BY 
    NextDOB ;

Die obige Abfrage deckt den gesamten nächsten Monat mit Ausnahme des aktuellen Datums ab.

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