PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MySQL-Datumswerte addieren und subtrahieren



Berthold
27-05-2002, 16:49
Eine SQL-Einführung, mit der ich immer mal wieder arbeite, gibt für Informix u.a. Systeme bei den Datumsfunktionen date() an, zeigt an Tag, Monat und Jahr.
Ich finde bei MySQL keine entsprechende Funktion.
Aufgabe, Ermittlung, ob's ein Schaltjahr ist

select date('01.03.1992') -1 from persdat where persnr = 1;

Das lässt sich in MySQL realisieren mit

select date_sub('1992-03-01', interval 1 day) from persdat where persnr = 1;

(Ergebnis 1992-29-02, ist ein Schaltjahr.)

Aber folgende Aufgabe
Wie viele Tage liegen zwischen dem 3.3.92 und dem 29.2.92,
nach Buch mit date() folgendermaßen

select date('03.03.1992') - date('29.02.1992') from persdat where persnr = 1;

also einfach das eine Datum vom anderen subtrahieren, Ergebnis die Zahl der Tage, nämlich 3, krieg ich mit MySQL auch nach einigem Handbuchstudium nicht hin.
Die MySQL-Funktionen curdate() oder now() geben einfach nur das aktuelle Datum aus und akzeptieren keine Zusatzargumente. Und ein Intervall bspw. year_month_date zu date_add und date_sub gibt es leider nicht.
Ebenso wenig schaff ich folgendes Beispiel

select date('15.05.1985') - eintritt from persdat where persnr = 1;

wobei eintritt eine Tabelle ist, die auch Datumswerte enthalt.

Also, wie kann ich in MySQL bei zwei Datumswerten mit Subtraktion, oder halt auch Addition arbeiten?
Gruß und Dank
Berthold

lolli
27-05-2002, 19:05
Hi,
prinzipiell kannst du die Differenz mit select to_days(DATUM1)-to_days(DATUM2);
ermitteln.
Es geht auch select to_days('19920301') - to_days('19920229');

Problematisch ist dabei allerdings, das das Format entweder ein MySQL-Datumsformat
sein muss, oder die Werte in Klammern im Format YYYYMMDD angegeben werden müssen.

select date('19850515') - TO_DAYS(eintritt) from persdat where persnr = 1;

Im diesem Beispiel muss eintritt von eben diesem Format sein. Alternativ muss du ein entsprechendes Layout errechnen.

Welches Format hat denn eintritt?

Oliver

Berthold
27-05-2002, 20:24
Klar, das müsste es sein, ich hab heut keine Zeit mehr, das auszuprobieren.
Is ja loggisch, wenn du für beide Werte die Zahl vom Jahr 0 an hast und dann subtrahierst. Hab ich völlig übersehen. Damit sollte Aufgabe 1 geloest sein.
Aufgabe 2 muss ich mal sehn.
Diese Tabelle eintritt hat auch das normale Datumsformat yyyy-mm-dd
Thanx, ich poste nochmal, ob das geklappt hat!
B.

lolli
27-05-2002, 20:40
> Aufgabe 2 muss ich mal sehn.
> Diese Tabelle eintritt hat auch das normale Datumsformat yyyy-mm-dd

Problem 2: Habe ich ganz übersehen. :-)

Zuerst benötigst du in beiden Tabellen eine ID, die die jeweiligen Tabellenzeilen eindeutig einem Objekt (Person) zuordnet. Möglicherweise ist das die persnr. Weiterhin brauchst du den Spaltennamen (Tabelle eintrag), die die Datumsangabe enthält. Ich unterstelle mal, die heisst 'datum'. Wenn dem so ist, sollte die folgende Abfrage funktionieren:

select persdat.persnr , to_days('19850515') - to_days(eintritt.datum) from persdat,eintrag where persdat.persnr = 1 AND persdat.persnr=eintrag.persnr;

Hoffentlich hilfts dir. Wenn nicht, wieder posten...

Oliver

Berthold
28-05-2002, 14:30
Mit der Abfrage, die du gestern gepostet hattest, ist alles paletti, beide Beispiele sind lösbar, also
select to_days('1992-03-03') - to_days('1992-02-29') from ...
und
select to_days('1985-05-15') - to_days(eintritt) from ...
Ich hatte da was falsch gepostet. eintritt ist keine eigene Tabelle, sondern ein (Datums)-Feld von persdat. Im üblichen Format yyyy-mm-dd.
Ich wühl mich dann mal weiter durch die Datums-, String-, Mathematischen u.a. Funktionen.
Danke
B.