Re: Geburtstagsliste
[ ruban.de ] [ Antworten ] [ Forum ]
Geschrieben von jens on April 07, 2004 um 18:54:
Als Antwort auf Geburtstagsliste geschrieben von Stefanie on April 05, 2004 um 15:35:
: Hallo, : bevor ich mir länger einen abbreche, frage ich doch lieber hier: : In meiner Kunden-DB ist das Geburtsdatum als Date gespeichert (10-stellig char = tt.mm.jjjj). : Ich benötige einen Zugriff, der mir zu einem : Eingabezeitraum (z.B. 29.04 - 03.05) alle Kunden, die in diesem Zeitraum Geburtstag haben liefert. Sollte natürlich auch über den Jahreswechsel funktionieren. : Kann mir jemand eine möglichst simple und performante SQL-Abfrage bieten? : Vielen Dank und Gruß : Stefanie Sofern ich das Problem richtig verstehe, spielt die Jahreszahl doch keine Rolle, es gibt doch nur eine vorgegeben starttag + monat und endmonat + endtag, insofern sollte es klappen:
-- BEISPIEL: DATEN HOLEN VOM 20.7. BIS ZUM 25.9. -- -- DIE UNTEN IM SQL BEFINDLICHEN MONATS / TAGESGRENZEN -- SIND LOGISCHERWEISE DURCH HOSTVARIBALEN ZU ERSETZEN. -- -- -- PRINZIPEILLES VORGEHEN: -- -- DIE DATEN WERDEN DIE DREI BLOECKEN ERMITTELT: -- -- (1) IM STARTMONAT ALLE SAETZE MIT PASSENDEN TAGEN -- (2) IM ENDMONAT ALLE SAETZE MIT PASSENDEEN TAGEN -- (3) FUER DIE ZWISCHENMONATE GILT (ALSO EXCLUSIV INTERVALLGRENZEN) -- (3A) WENN JAHRESWECHSEL (ALSO WERTE VON Z.B. NOV BIS FEB -- DANN IST DER NOV IN BLOCK (1) EH SCHON ENTHALTEN -- DER FEB IST IN BLOCK (2) ENTHALTEN -- DER DEZ IST ZU HOLEN UND DER JAN -- ALLGEMEINER: VOM STARTMONAT + 1 BIS JAHRESENDE -- VOM JAHRESANFANG BIS ENDMONAT - 1 -- (3B) WENN KEIN JAHRESWECHSEL -- DANN TRIVIAL, SPRICH HOLE DATEN -- VOM STARTMONAT BIS ENDMONAT ABER EXCLUSIV -- DEN START / ENDMONAT DA FUER DIESEN DER TAG EINE ROLLE SPIELT -- UND IN BLOCK 1 BZW. BLOCK 2 ENTHALTEN IST -- -- SCHALTJAHRE SIND KEIN PROBLEM, DENN WENN DIE FEBRUAR DATEN -- A) IN BLOCK (3A) BZW. (3B) LIEGEN EH UNPROBLEMATISCH -- B) IN BLOCK (1) LIEGEN AUCH KEIN THEMA (29 IST NUMERISCH -- EINFACH GROESSER ALS ALS VORGEGEBNENER STARTTAG) -- C) IN BLOCK (2) LIEGEN AUCH KEIN THEMA, -- 29 IST NUMERISCH KLEINER ALS ALS EIN VORGEGEBENER TAG -- -- -- SOFERN DIE INTERVALL GRENZE NICHT AUF EINEM TAG INNERHALB VOM MONAT -- LIEGT, SONDERN NUR DATEN VON MONAT BIS MONAT GESUCHT SIND, -- ENTFAELLT BLOCK 1 UND BLOCK 2 ERSATZLOS, IN BLOCK 3A UND BLOCK 3B -- MUSS DANN LOGISCHERWEISE MIT = GEARBEITET WERDEN. -- -- -- DELETE FROM PLAN_TABLE WHERE QUERYNO = 9999 ; EXPLAIN PLAN SET QUERYNO = 9999 FOR SELECT * FROM TABELLE WHERE -- BLOCK (1) HOLE ALLE WERTE AUS DEM STARTMONAT ( MONTH(DATUMSFELD) = 7 -- STARTMONAT AND DAY(DATUMSFELD) >= 20 -- STARTTAG ) -- BLOCK (2) HOLE ALLE WERTE AUS DEM ENDMONAT OR ( MONTH(DATUMSFELD) = 9 -- ENDMONAT AND DAY(DATUMSFELD) 7 -- STARTMONAT OR MONTH(DATUMSFELD) 9 -- STARTMONAT > ENDEMONAT ? -- DANN LIEGT JAHRESWECHSEL VOR -- UND ES KONNEN DIE DATEN VOM -- STARTMONAT BIS DEZEMBER BZW. -- DIE DATEN VON JANUAR BIS ENDMONAT -- GEHOLT WERDEN (ABER OHNE DIE -- START / ENDMONATE SELBER, DA -- FUER DIESE DIE TAGE EINE ROLLE -- SPIELEN ) -- BLOCK (3B) FALLS OHNE JAHRESWECHSEL OR ( MONTH(DATUMSFELD) > 7 -- STARTMONAT AND MONTH(DATUMSFELD) < 9 -- ENDMONAT AND 7 < 9 -- OHNE JAHRESWECHSEL ) ORDER BY DATUMSFELD ;
Schreibe eine Antwort
|