DATE_ADD mit dynamischem Typ
DATE_ADD mit dynamischem Typ
am 18.07.2006 15:31:10 von marco.mehnert
Hallo NG,
ich habe mich schon vielerorts umgetan aber leider noch nichts
gefunden. Vielleicht weiss hier jemand bescheid....
Folgendes: Ich habe eine Tabelle, die Veranstaltungen speichern soll.
Die für das Problem relevanten Felder sind
eventDate -> datetime -> das Startdatum
eventDuration -> int(10) unsigned -> die Dauer
eventDurationUnit -> varchar(10) -> Typ der Dauer (HOUR, DAY, MONTH
...)
Ich benötige nun eine Abfrage, die vom Enddatum ermittelt, ob es in
einen bestimmten Zeitraum fällt.
Mein (nicht funktionierender) Ansatz war:
SELECT * FROM t_events WHERE YEAR(t_events.eventDate)=3D2006 OR
YEAR(DATE_ADD(t_events.eventDate, INTERVAL eventDuration
eventDurationUnit))=3D2006
Wenn ich hingegen das Typwort direkt hineinschreibe:
YEAR(DATE_ADD(t_events.eventDate, INTERVAL eventDuration MONTH))=3D2006
funktioniert es. Gibt es eine Möglichkeit, das Schlüsselwort aus dem
Datenbankfeld zu entnehmen oder sollte ich besser darauf ausweichen,
das Enddatum mitzuspeichern, um keine derartigen Berechnungen
durchführen zu müssen. Für andere Funktionen meiner Anwendung ist
dies leider mit den Intervallängen besser so. Für die reine
Selektierung der in eine bestimmte Periode fallenden Datensätze
offensichtlich nicht. Bevor ich allerdings meine Datenbanktabelle und
den zugehörigen PHP-Code umorganisiere, wäre ich froh, wenn mir
jemand sagen würde, das mein Ansatz hoffnungslos nicht funktioniert
oder besser noch einen Lösungsweg, wie es funktioniert.
SELECT VERSION(); -> 4.0.18
Besten Dank und ebensolche Grüße
Marco
Re: DATE_ADD mit dynamischem Typ
am 18.07.2006 15:48:43 von Christian Kirsch
Marco Mehnert schrieb:
> Hallo NG,
>
> ich habe mich schon vielerorts umgetan aber leider noch nichts
> gefunden. Vielleicht weiss hier jemand bescheid....
>
> Folgendes: Ich habe eine Tabelle, die Veranstaltungen speichern soll.
> Die für das Problem relevanten Felder sind
> eventDate -> datetime -> das Startdatum
> eventDuration -> int(10) unsigned -> die Dauer
> eventDurationUnit -> varchar(10) -> Typ der Dauer (HOUR, DAY, MONTH
> ...)
Was spricht dagegen, das zweite und dritte Feld zusammenzufassen und
als DATETIME zu speichern?
>
> Ich benötige nun eine Abfrage, die vom Enddatum ermittelt, ob es in
> einen bestimmten Zeitraum fällt.
> Mein (nicht funktionierender) Ansatz war:
>
> SELECT * FROM t_events WHERE YEAR(t_events.eventDate)=2006 OR
> YEAR(DATE_ADD(t_events.eventDate, INTERVAL eventDuration
> eventDurationUnit))=2006
>
Und *was* funktioniert daran nicht? Fehlermeldung? Flasches Ergebnis?
Abstürzender Rechner? Kaffeetasse umgefallen?
> Wenn ich hingegen das Typwort direkt hineinschreibe:
> YEAR(DATE_ADD(t_events.eventDate, INTERVAL eventDuration MONTH))=2006
> funktioniert es. Gibt es eine Möglichkeit, das Schlüsselwort aus dem
> Datenbankfeld zu entnehmen oder sollte ich besser darauf ausweichen,
> das Enddatum mitzuspeichern, um keine derartigen Berechnungen
> durchführen zu müssen.
Ich vermute, das MySQL in INTERVAL an der letzten Position keine
Datenbankfelder sehen möchte. Vermutlich sind dort nur die
reservierten Wörter MONTH, DAY, etc. erlaubt und nicht irgendwas, das
MySQL erst interpretieren müsste.
> Für andere Funktionen meiner Anwendung ist
> dies leider mit den Intervallängen besser so. Für die reine
> Selektierung der in eine bestimmte Periode fallenden Datensätze
> offensichtlich nicht. Bevor ich allerdings meine Datenbanktabelle und
> den zugehörigen PHP-Code umorganisiere, wäre ich froh, wenn mir
> jemand sagen würde, das mein Ansatz hoffnungslos nicht funktioniert
> oder besser noch einen Lösungsweg, wie es funktioniert.
Wie gesagt: Dauer als Datetime oder Endtermin (auch als Datetime)
speichern und das Suchen/Rechnen der Datenbank überlassen.
Re: DATE_ADD mit dynamischem Typ
am 18.07.2006 16:02:02 von marco.mehnert
Hallo Christian,
vielen Dank für Dein schnelles Feedback. Ich habe es ja fast
befürchtet...
Christian Kirsch schrieb:
> Marco Mehnert schrieb:
> > Hallo NG,
> >
> > ich habe mich schon vielerorts umgetan aber leider noch nichts
> > gefunden. Vielleicht weiss hier jemand bescheid....
> >
> > Folgendes: Ich habe eine Tabelle, die Veranstaltungen speichern soll.
> > Die für das Problem relevanten Felder sind
> > eventDate -> datetime -> das Startdatum
> > eventDuration -> int(10) unsigned -> die Dauer
> > eventDurationUnit -> varchar(10) -> Typ der Dauer (HOUR, DAY, MONTH
> > ...)
>
> Was spricht dagegen, das zweite und dritte Feld zusammenzufassen und
> als DATETIME zu speichern?
Eigentlich nichts, nur, dass ich diese Werte zur Darstellung brauche.
Wenn ich aus den beiden DATE_TIME Feldern so etwas wie die Dauer
herausbekäme incl der Einheit wäre es sicher möglich auf die beiden
Felder zu verzichten. Aber auch das wird wieder nicht mit einer Abfrage
abgehen also speichere ich beides...
> > SELECT * FROM t_events WHERE YEAR(t_events.eventDate)=3D2006 OR
> > YEAR(DATE_ADD(t_events.eventDate, INTERVAL eventDuration
> > eventDurationUnit))=3D2006
> >
>
> Und *was* funktioniert daran nicht? Fehlermeldung? Flasches Ergebnis?
> Abstürzender Rechner? Kaffeetasse umgefallen?
You have an error in your SQL syntax.... Sorry für die Ungenauigkeit.
Keine Datensätze wäre ja schonmal nicht schlecht... Flasches
Ergebnis? ;-) Kaffetasse? Bei dem Wetter?
>
> > Wenn ich hingegen das Typwort direkt hineinschreibe:
> > YEAR(DATE_ADD(t_events.eventDate, INTERVAL eventDuration MONTH))=3D2006
> > funktioniert es. Gibt es eine Möglichkeit, das Schlüsselwort aus dem
> > Datenbankfeld zu entnehmen oder sollte ich besser darauf ausweichen,
> > das Enddatum mitzuspeichern, um keine derartigen Berechnungen
> > durchführen zu müssen.
>
> Ich vermute, das MySQL in INTERVAL an der letzten Position keine
> Datenbankfelder sehen möchte. Vermutlich sind dort nur die
> reservierten Wörter MONTH, DAY, etc. erlaubt und nicht irgendwas, das
> MySQL erst interpretieren müsste.
Das vermute/befürchte ich eben auch...
>
>
> > Für andere Funktionen meiner Anwendung ist
> > dies leider mit den Intervallängen besser so. Für die reine
> > Selektierung der in eine bestimmte Periode fallenden Datensätze
> > offensichtlich nicht. Bevor ich allerdings meine Datenbanktabelle und
> > den zugehörigen PHP-Code umorganisiere, wäre ich froh, wenn mir
> > jemand sagen würde, das mein Ansatz hoffnungslos nicht funktioniert
> > oder besser noch einen Lösungsweg, wie es funktioniert.
>
> Wie gesagt: Dauer als Datetime oder Endtermin (auch als Datetime)
> speichern und das Suchen/Rechnen der Datenbank überlassen.
Werd ich jetzt wohl so machen, um nicht noch mehr Zeit zu verlieren.
ich dachte nur ich könnte noch etwas SQL hinzulernen. War dann wohl
nix...
Vielen Dank nochmal
Gruß
Marco
Re: DATE_ADD mit dynamischem Typ
am 18.07.2006 16:22:36 von Christian Kirsch
Marco Mehnert schrieb:
> Hallo Christian,
>
> vielen Dank für Dein schnelles Feedback. Ich habe es ja fast
> befürchtet...
>
> Christian Kirsch schrieb:
>
>> Marco Mehnert schrieb:
>>> Hallo NG,
>>>
>>> ich habe mich schon vielerorts umgetan aber leider noch nichts
>>> gefunden. Vielleicht weiss hier jemand bescheid....
>>>
>>> Folgendes: Ich habe eine Tabelle, die Veranstaltungen speichern soll.
>>> Die für das Problem relevanten Felder sind
>>> eventDate -> datetime -> das Startdatum
>>> eventDuration -> int(10) unsigned -> die Dauer
>>> eventDurationUnit -> varchar(10) -> Typ der Dauer (HOUR, DAY, MONTH
>>> ...)
>> Was spricht dagegen, das zweite und dritte Feld zusammenzufassen und
>> als DATETIME zu speichern?
>
> Eigentlich nichts, nur, dass ich diese Werte zur Darstellung brauche.
> Wenn ich aus den beiden DATE_TIME Feldern so etwas wie die Dauer
> herausbekäme incl der Einheit wäre es sicher möglich auf die beiden
> Felder zu verzichten. Aber auch das wird wieder nicht mit einer Abfrage
> abgehen also speichere ich beides...
>
Ich denke, das kann man einfach durch ein geeignetes Format bei der
Ausgabe lösen, etwa in der Art yy-mm-dd hh:ss. Wenn Du das erst ab dem
ersten Wert anzeigst, der nicht 0 ist ...