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

Patrick Szalapski Punkte 7759

Angenommen, es handelt sich um T-SQL, dann verwenden Sie DATEPART, um den Monat und das Datum getrennt zu vergleichen.

http://msdn.microsoft.com/en-us/library/ms174420.aspx

Alternativ können Sie auch den 1. Januar des laufenden Jahres vom Geburtstag aller Personen abziehen und dann mit dem Jahr 1900 (oder dem Jahr Ihrer Epoche) vergleichen.

0voto

Renato M Punkte 1

Hier brauchen wir das Real und das Next, um zu vergleichen, ob es schon vorbei ist

CREATE FUNCTION dbo.FN_NEXT_BIRTHDAY(@BIRTHDAY DATE)
RETURNS DATE
AS
BEGIN
    DECLARE @ACTUAL DATE = DATEADD(YEAR, DATEDIFF(YEAR, @BIRTHDAY , GETDATE()), @BIRTHDAY);
    DECLARE @NEXT DATE = DATEADD(YEAR, DATEDIFF(YEAR, @BIRTHDAY , GETDATE())+1, @BIRTHDAY);

    RETURN CASE WHEN @ACTUAL > GETDATE() THEN @ACTUAL 
                ELSE @NEXT 
                END;
END;

-1voto

Nenad SRB Punkte 1

Versuchen Sie meine Lösung... Ich habe eine Informix-Datenbank...

SELECT person, year(today)-year(birthdate) as years, birthdate,

CASE
WHEN MOD(year(birthdate)+((year(today)-year(birthdate))+1),4)<>0 AND MONTH(birthdate)=2 AND DAY(birthdate)=29 THEN 
   CASE 
   WHEN mdy(month(birthdate), 28, year(birthdate)+((year(today)-year(birthdate))+1))-today >= 365 THEN (mdy(month(birthdate), 28, year(birthdate)+((year(today)-year(birthdate))+1))-today)-365
   WHEN mdy(month(birthdate), 28, year(birthdate)+((year(today)-year(birthdate))+1))-today < 365 THEN mdy(month(birthdate), 28, year(birthdate)+((year(today)-year(birthdate))+1))-today
   END
ELSE
   CASE 
   WHEN mdy(month(birthdate), day(birthdate), year(birthdate)+((year(today)-year(birthdate))+1))-today >= 365 THEN (mdy(month(birthdate), day(birthdate), year(birthdate)+((year(today)-year(birthdate))+1))-today)-365
   WHEN mdy(month(birthdate), day(birthdate), year(birthdate)+((year(today)-year(birthdate))+1))-today < 365 THEN mdy(month(birthdate), day(birthdate), year(birthdate)+((year(today)-year(birthdate))+1))-today
   END
END until

FROM table_name
WHERE mdy(month(birthdate), day(birthdate), 2000) >= mdy(month(today), day(today), 2000)
AND mdy(month(birthdate), day(birthdate), 2000) <= mdy(month(today), day(today), 2000)+30
OR
mdy(month(birthdate), day(birthdate), 2000) <= mdy(month(today), day(today), 2000)-(365-30)
ORDER BY 4, YEAR(birthdate)

-1voto

Bhavesh Patel Punkte 1

Aktueller Monat Geburtstag

SELECT * FROM tblMember m
WHERE m.GDExpireDate != '' 
AND CONVERT(CHAR(2),CONVERT(datetime, m.dob, 103), 101) = CONVERT(CHAR(2), GETDATE(), 101)    
AND CONVERT(CHAR(2),CONVERT(datetime, m.dob, 103), 103) >= CONVERT(CHAR(2), GETDATE(), 103)

-1voto

The-Kido Punkte 1
CREATE PROCEDURE [dbo].[P_EmployeesGetBirths]
        @Date Date,
        @Days int
    as
    Begin
        SET NOCOUNT ON;

        Declare
            @From int = Month(@Date) * 100 + Day(@Date),
            @To int = Month(DateAdd(DD, @Days, @Date)) * 100 + Day(DateAdd(DD, @Days, @Date)),
            @NeutralDate Date = Cast('1900-'+cast(Month(@Date) as nvarchar(2))+'-' + cast(Day(@Date) as nvarchar(2)) as Date)

        Select
            DOB,
            DATEADD(DD, DateDiff(DD, @NeutralDate, DateAdd(YY, 1900-Year(DOB), DOB)), @Date) OnDate
        From
            Employees(nolock)
        Where
            DOB is not null and
            Month(DOB) * 100 + Day(DOB) between @From and @To
        order by
            Month(DOB) * 100 + Day(DOB)
    End
    Go

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