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 ;




Antworten:


Schreibe eine Antwort

Name:   
E-Mail:  

Thema:

Kommentar:

Optionale Link URL:   
Link Titel:                  
Optionale Image URL:


[ Antworten ] [ Forum ]