Datum string zu date formatieren

Michi_R

Fleissiger Benutzer
Beiträge
81
Hallo Leute,

ich habe eine Spalte, da steht das Datum in diesem Format drin:
'Feb 21 2014 12:00AM'

Ich will meine Abfrage aber anhand dieser Spalte eingrenzen, nämlich nur alles was neuer 01.03.2014.
Also date>'2014-03-01 00:00:00.000'
Das funktioniert so natürlich nicht weil date nicht als datetime sondern als String vorliegt.

Kann man wer sagen wie ich meine Spalte entsprechend formierte (im Query), sodass der Filter klappt? Ich will nicht 1000 zeilen mit nach PHP nehmen und dort aussortieren.

DANKE
 
Werbung:
Hallo Leute,

ich habe eine Spalte, da steht das Datum in diesem Format drin:
'Feb 21 2014 12:00AM'

Ich will meine Abfrage aber anhand dieser Spalte eingrenzen, nämlich nur alles was neuer 01.03.2014.
Also date>'2014-03-01 00:00:00.000'
Das funktioniert so natürlich nicht weil date nicht als datetime sondern als String vorliegt.

Kann man wer sagen wie ich meine Spalte entsprechend formierte (im Query), sodass der Filter klappt? Ich will nicht 1000 zeilen mit nach PHP nehmen und dort aussortieren.

DANKE

Warum speicherst das denn überhaupt falsch? Es gibt sicher Fuktionen, die das umwandeln, in PG ginge es etwa so:

Code:
test=*# select to_timestamp('Feb 21 2014 12:00AM','MON DD YYYY HH24');;
  to_timestamp
------------------------
 2014-02-21 12:00:00+01
(1 row)

Der Punkt ist aber: Du brauchst dann in der DB einen Full-Table-Scan, wo für jede Row diese Funktion ausgeführt wird, erst dann kann Du damit ja arbeiten. Dafür bieten zwar manche Datenbanken funktionale Indexe, was aber hier auch nicht so einfach ist, da to_timestamp nicht IMMUTABLE ist. (ist abhängig von der lokalen Zeitzone des Clients).

Also in kurz: falsches Design, fixe das und suche nicht nach schmutzigen Workarounds.
 
Ja, da hast du schon recht, dass das Pfusch ist.
Es gibt ein System, das die Daten in die Datenbank schreibt. Dieses System gibt mir nur string und nur das format wie oben (Mar 30 2014...).
Wenn ich eine datetime spalte anlege und dann obigen string einfüge bekomme ich natürlich einen Fehler.
Kann ich der Datenbank irgendwie "erklären", wie sie 'Mar 20 2014 12:00AM' in ein Datetime umwandelt und das dann korrekt als Datetime speichert? Wohl nicht, oder? Also beim insert quasi die syntax mitgeben?
Ich müsste den Input eben ändern und das kann ich im Moment nicht.
 
Also SELECT cast('Feb 21 2014 12:00AM' AS DATETIME) liefert bei mir einwandfrei ein Datum zurück. Das kannst du im Select genauso wie beim Insert verwenden, um deinen String vorm Einfügen in die DB zu konvertieren.
 
Danke, das sieht gut aus. Ich sehe aber ein neues Problem.
Was, wenn das Feld leer bleiben soll, also null?
Dann will er null in ein DateTime formatieren und wirft einen Fehler.
Wie kann man den fall behandeln?

...ansonsten funktioniert es super.
 
Danke, das sieht gut aus. Ich sehe aber ein neues Problem.
Was, wenn das Feld leer bleiben soll, also null?
Dann will er null in ein DateTime formatieren und wirft einen Fehler.
Wie kann man den fall behandeln?

...ansonsten funktioniert es super.

Code:
test=*# SELECT cast('Feb 21 2014 12:00AM' AS timestamp);
  timestamp
---------------------
 2014-02-21 00:00:00
(1 row)

Time: 0,168 ms
test=*# SELECT cast(NULL AS timestamp);
 timestamp
-----------

(1 row)

Kein Problem, oder?
 
Puh, da sagt er bei mir leider
"Arithmetischer Überlauffehler beim Konvertieren von expression in den datetime-Datentyp."

Query:
insert into time_test values (cast('Feb 21 2014 12:00AM' AS timestamp))
 
Werbung:
Was genau versichst du denn? Wenn ich SELECT cast(NULL AS timestamp) mache bekomme ich "0x" angezeigt. Ist deine Spalte eventuell als TIMESTAMP NOT NULL angelegt?
 
Zurück
Oben