# Ein String als Date nutzen?



## Gudy (23. Februar 2006)

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


----------



## Mik3e (23. Februar 2006)

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


----------



## hpvw (23. Februar 2006)

Zur Not kann man in MySQL auch aus einem Char ein richtiges Datum machen.
Sinnvoller wäre aber, das Datenbankdesign zu ändern und als Typ ein echtes DATE zu nehmen, zur Not auch ein INT als Unix-Timestamp.
Zu dieser Entscheidung gab es bereits eine Diskussion.

Gruß hpvw


----------



## vop (24. Februar 2006)

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


----------



## Mik3e (24. Februar 2006)

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:

```
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


----------



## vop (25. Februar 2006)

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.
> 
> ...



Das sehe ich anders.
Mit

```
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


----------



## Mik3e (25. Februar 2006)

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


----------



## Matthias Reitinger (25. Februar 2006)

Mik3e hat gesagt.:
			
		

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


Vergleiche:

```
SELECT … WHERE `datum_als_varchar` > 2006-02-25
entspricht
SELECT … WHERE `datum_als_varchar` > 1979
```


```
SELECT … WHERE `datum_als_varchar` > '2006-02-25'
```


----------



## Gudy (28. Februar 2006)

Hi, wenn ich das richtig sehe müsste das ja fluppen.

```
SELECT … WHERE `datum_als_varchar` > '2006-02-25'
```


warum geht dann aber nicht 

```
SELECT … WHERE `datum_als_varchar` > '2006-02-25' AND `datum_als_varchar` < '2006-02-28'
```

es gibt dann immer "0" Datensätze


----------



## ManicMarble (28. Februar 2006)

Ich habe zwar keine Ahnung, warum 

```
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:

```
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_


----------



## Gudy (2. März 2006)

... das is natürlich auch eine Möglichkeit, aber mich würde erstmal Interresieren warum das mit dem AND dazwishcen dann nicht mehr geht ...


----------

