Ein String als Date nutzen?

Gudy

Erfahrenes Mitglied
Hi, ich ahbe hier eine MySql Datenbank, in dieser ist ein Feld, was den TYP String hat in diesem steht ein Datum. 01.01.2006 z.B.

jetzt würd ich gern mit
"...WHERE `DatumAlsAtring` < '31.12.2005' " ein abfrage machen, egth aber nicht weil es ja ein String ist und dann kann ich ja nicht auf "größer;kleiner" vergleichen. Kann ich den Variablentyp für eine Abfrage ändern?

Danke
 
Hi,

Ne, das wird so nicht gehen... Datumsvergleich geht nur, wenn der Typ in der DB tatsächlich DATE oder DATETIME ist.

Ich würde Dir empfehlen den STRING in der DB zuerst mit String Funktionen zurecht zu rücken und anschließend mit UNIX_TIMESTAMP() auszuliefern.

Dann kannst Du das Datum direkt mit dem aktuellen Unix-timestamp (in PHP z.B. [phpf]mktime()[/phpf] vergleichen.

Andere Variante:
Wenn Du die Stammdaten ändern kannst schreib Dir eine Funktion, die dir das Datum korrekt formatiert (YYYY-MM-DD) und ändere nachher den Datentyp des Attributs in der Tabelle.

Ciao,
Mike
 
Was anderes wäre es, wenn der String, in dem das Datum steht in der Form 2006-12-31, also JJJJ-MM-TT wäre, dann wäre ein Vergleich problemlos möglich.

Eine solche Form ist manchmal sinnvoll, wenn man die Daten in verschiedenen Datenbanken nutzen will.

Wenn ich dich richtig verstanden habe, ist die Form aber vorgegeben als tt.mm.jjjj ?

vop
 
Hi,

Ne, auch wenn das Format YYYY-MM-DD ist, und das Attribut in der DB vom Typ VARCHAR oder TEXT ist, kannst Du keinen Vergleich machen.

Also:
PHP:
SELECT .... WHERE `datum_als_varchar`>'.date('Y-m-d').'....

spielts dann auch nicht. Hatte damit mal ein ziemliches Problem. Möglich ist allerdings, dass neue MySQL Versionen diesen Vergleich bereits unterstützen..

Ciao,
Mike
 
Mik3e hat gesagt.:
Hi,

Ne, auch wenn das Format YYYY-MM-DD ist, und das Attribut in der DB vom Typ VARCHAR oder TEXT ist, kannst Du keinen Vergleich machen.

Also:
PHP:
SELECT .... WHERE `datum_als_varchar`>'.date('Y-m-d').'....
spielts dann auch nicht.

Das sehe ich anders.
Mit
PHP:
SELECT .... WHERE MeineTextuelleDatumSpalte > "2005-12-31"...
geht es wunderbar, wenn MeineTextuelleDatumsSpalte varchar oder Text ist.
Man muß halt den Vergleich mit einem String, der ebenfalls entsprechend formattiert ist durchführen.
Wie gesagt, der Vorteil ist dann, dass es mit jeder DB funktionier, wenn man nur einen String verwendet.
Nachteile gibt es allerdings auch. Datumsberechnungen sind bspw. etwas aufwendiger (aber nicht unlösbar).

vop
 
Hat wie gesagt bei mir nicht funktioniert.. Vor allem wenn es dann um Berechnungen im SQL Query geht, schaust Du durch die Finger...

Aber:
Kann durchaus sein, dass es mit neueren Versionen von MySQL bereits möglich ist. Das damalige Problem ist sicher schon 2 Jahre her...

Ciao,
Mike
 
Mik3e hat gesagt.:
Also:
PHP:
SELECT .... WHERE `datum_als_varchar`>'.date('Y-m-d').'....

spielts dann auch nicht. Hatte damit mal ein ziemliches Problem. Möglich ist allerdings, dass neue MySQL Versionen diesen Vergleich bereits unterstützen.
Vergleiche:
Code:
SELECT … WHERE `datum_als_varchar` > 2006-02-25
entspricht
SELECT … WHERE `datum_als_varchar` > 1979
Code:
SELECT … WHERE `datum_als_varchar` > '2006-02-25'
 
Hi, wenn ich das richtig sehe müsste das ja fluppen.
PHP:
SELECT … WHERE `datum_als_varchar` > '2006-02-25'


warum geht dann aber nicht
PHP:
SELECT … WHERE `datum_als_varchar` > '2006-02-25' AND `datum_als_varchar` < '2006-02-28'

es gibt dann immer "0" Datensätze
 
Ich habe zwar keine Ahnung, warum
SQL:
SELECT … WHERE `datum_als_varchar` > '2006-02-25' AND `datum_als_varchar` < '2006-02-28'
keine Datensätze liefert, obwohl MySQL das anstandslos macht (sofern `datum_als_varchar` im Format YYYY-MM-DD ist), aber ich würde die Funktion STR_TO_DATE() verwenden. Die ist recht tolerant gegenüber String-Formaten. So wandeln all diese Beispiele den String in ein korrektes Datum:
SQL:
SELECT STR_TO_DATE('28.02.2006', '%d.&m.&Y') => 2006-02-28
SELECT STR_TO_DATE('28.2.2006', '%d.%m.%Y')  => 2006-02-28
SELECT STR_TO_DATE('1.3.2006', '%d.%m.%Y')   => 2006-03-01
SELECT STR_TO_DATE('1.3.70', '%d.%m.%y')     => 1970-03-01
SELECT STR_TO_DATE('28.02.69', '%d.%m.%y')   => 2069-03-01
Ist also auch bei 2-stelligen Jahreszahlen Y2K-sicher.

Viel Spaß damit,
Martin
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück