2010-09-20 4 views
5

Dieser hat mich für eine Weile jetzt abgehört. Als ich vor einigen Jahren einen Code für einen Kunden neu auflegte, fragte ich mich, ob es eine elegantere Lösung für das Problem gibt.SQL Server 2005, Berechnung anstehender Geburtstage vom Geburtsdatum

Der Kunde speichert alle ihre Kunden Informationen einschließlich Geburtsdatum (Datum Zeitfeld)

Sie führen einen Auszug jeden Montag, die jeden Kunden Geburtstag dessen ruft innerhalb der darauf folgenden Woche fallen.

I.e. Wenn der Auszug am Montag, dem 1. Januar, ausgeführt wurde, würden Kunden, deren Geburtstag zwischen Montag, dem 8. Januar -> Sonntag, dem 14. Januar fiel (einschließlich), abgerufen.

Meine Lösung war, die Funktion Datepart (dy) zu verwenden und alle anstehenden Geburtstage basierend auf dem Geburtstag des Kunden zu berechnen, um den Extrakt am Ende eines Jahres zu verwenden. Das Problem war, dass die Verwendung von Tag des Jahres die Ergebnisse um 1 Tag abbricht, wenn der Kunde in einem Schaltjahr geboren wurde und/oder der Extrakt in einem Schaltjahr nach dem 29. Februar läuft, also musste ich noch mehr hinzufügen Logik so die Prozedur die erwarteten Ergebnisse zurückgegeben.

Dies schien ziemlich über-kill für was sollte eine einfache Aufgabe sein Zur Vereinfachung sagen wir, die Tabelle "Kunde" enthält 4 Felder, Vorname, Nachname, DOB und Adresse.

Vorschläge, wie dies zu vereinfachen würde wirklich

Wes

Antwort

4

Würde so etwas für Sie funktionieren?

select * from Customers c 
where dateadd(year, 1900-year(dob), dob) 
    between dateadd(year, 1900-year(getdate()), getdate()) 
    and dateadd(year, 1900-year(getdate()), getdate())+7 
+1

Natürlich! Ich sehe jetzt. Vielen Dank für Ihre Erklärung. Es scheint so offensichtlich, jetzt verstehe ich, wie es funktioniert! Sobald du festgesessen hast, etwas auf die gleiche Weise zu betrachten, vermisst du das Offensichtliche. Danke vielmals. –

+1

Ach komm schon, es ist die Kraft von SO! Wissen Sie, Brainstorming Dinge. –

+0

Ich habe diese Methode mit 30 Tagen verwendet und ich fand, dass es zu dieser Jahreszeit (15. Dezember) nicht funktioniert. Schauen Sie sich die Antwort hier an: http://stackoverflow.com/questions/83531/sql-select-upcoming-birthdays – Warren

3

Warum nicht DATEPART (wk) auf der diesjährigen Geburtstag geschätzt werden?

SET DATEFIRST 1 -- Set first day of week to monday 
SELECT * FROM customer 
WHERE DATEPART(wk, DATEADD(yy, DATEPART(yy, GETDATE()) - DATEPART(yy, customer.dob), customer.dob)) = DATEPART(wk, GETDATE()) + 1 

Es wählt alle Kunden aus, deren Geburtstag die Wochennummer um eins größer ist als die aktuelle Wochennummer.

+0

ich diese Lösung gefällt ... Aber was, wenn wir von Montag beginnen nicht, aber von Donnerstag. Oh, ich sehe ... :) –

+1

1. Laut MS "SETDATE FIRST 1" ist Sonntag nicht Montag – Unreason

+2

@ Unreason: Nein, es ist Montag. Siehe http://msdn.microsoft.com/en-us/library/ms181598.aspx – Carvellis

2

Ich denke, DATEADD sollte das Richtige tun.

+0

Ich sehe nicht, wie Sie DateAdd verwenden würden. Customer DOB's variieren .. d. H. 04/01/1965, 02/06/1982 etc etc .. –

+0

@Wes Preis, siehe meine Antwort. –

1
YEAR(GETDATE() - dbo.Patients.Dob) - 1900 

ich Sie sicher davon ausgehen kann, wird nie

+3

[Sie können] (http://en.wikipedia.org/wiki/Oldest_people#Ten_verified_oldest_people_living)? – fredley

+0

Ich weiß, dass dieser Beitrag alt ist, aber ich stimme Tom zu. – RoLYroLLs

1

vor 1900 Kunden geboren haben diese eine Bitte versuchen Sie es.

SELECT TOP 10 BirthDate, FirstName 
FROM Customers 
WHERE DATEPART(mm,BirthDate) >= DATEPART(mm,GETDATE()) 
AND DATEPART(day,BirthDate) >= DATEPART(day,getdate()) 
OR DATEPART(mm,BirthDate) > DATEPART(mm,getdate()) 
ORDER BY DatePart(mm,BirthDate),DatePart(day,BirthDate) 

diese Abfrage anstehende Geburtstage bekommen heute mit sich