Zeichenketten formatieren
Zeichenketten formatieren
am 31.12.2004 11:16:05 von Daniel Pilar
Hallo,
ich habe da ein kleines Problem und hoffe auf Eure Hilfe, da ich wenig
Programmiererfahrung habe.
Ich habe in einer mySQL-Tabelle mit ca. 900 Datensätzen eine Tabelle mit
einer Spalte Datum.
Das Datum steht drin im deutschen Format: z.B. 31.12.2005 12:15
Habe vorher irtümlicherweise das Datumsfeld als VARCHAR(20) definiert und
dort das Datum im deutschen Format eingetragen.
Nun möchte ich aber das Datumsfeld in DATETIME umwandeln und dabei das
deutsche Datumsformat
ins amerikanische 2005-12-31 12:15 umwandeln. Habs dann einfacher mit
Rechnen mit mySQL-Datum NOW() etc..
ich will über die while-Schleife nacheinander die einzelnen Dati auslesen,
sie ins amerikanische Format umwandeln und wieder in die Tabelle schreiben.
Anschliessend kann ich den Datentyp dann auf DATETIME setzen. Nur kenn ich
mich leider mit Zeichenketten-Funktionen nicht gut aus. Vielleicht kann mir
jemand ein Vorschlag machen. das wäre sehr nett.
hier mein Ansatz:
$ergebnis = mysql_query( "SELECT Datum FROM pwhoonline" );
$anz_reihen = mysql_num_rows( $ergebnis );
while ($datensatz = mysql_fetch_object( $ergebnis ) )
{
//wandele $datensatz[Datum] ins Format JJJJ-MM.DD HH:MM:SS und
schreibe den Wert zurück in die Tabelle
}
vielleicht mach ichs mir aber auch zu kompliziert.
vielen Dank im Voraus
Daniel Pilar
Re: Zeichenketten formatieren
am 31.12.2004 11:26:37 von Daniel Pilar
sorry kleine Korrektur:
deutsches Datum liegt in Form von z.B. 31.12.2005 12:15 vor und soll
ins Format 2005-12-31 12:15:00 gebracht werden
Daniel Pilar
Re: Zeichenketten formatieren
am 31.12.2004 11:50:00 von Knut Ahlers
Am Fri, 31 Dec 2004 11:26:37 +0100 schrieb Daniel Pilar:
> sorry kleine Korrektur:
>
> deutsches Datum liegt in Form von z.B. 31.12.2005 12:15 vor und soll
> ins Format 2005-12-31 12:15:00 gebracht werden
>
> Daniel Pilar
Hallo Daniel,
das geht zwar sicher auch anders, aber die einfachste Methode ist imho die
Zeichenketten per RegEx zu bearbeiten. Dazu empfehle ich dir diese
Seite[1] dort ist das sehr gut erklärt.
[1] http://korenordmann.de/reg_exps_lernen.html
Wenn du dann noch Fragen hast einfach Fragen.
--
MFG Knut Ahlers
webmaster@knutshome.de
www.knutshome.de - www.rw-tng.de
Ich nutze Debian-Linux! www.debian.de
Re: Zeichenketten formatieren
am 31.12.2004 17:12:33 von Michael Fesser
.oO(Daniel Pilar)
>Nun möchte ich aber das Datumsfeld in DATETIME umwandeln und dabei das
>deutsche Datumsformat
>ins amerikanische 2005-12-31 12:15 umwandeln. Habs dann einfacher mit
>Rechnen mit mySQL-Datum NOW() etc..
>
>ich will über die while-Schleife nacheinander die einzelnen Dati auslesen,
>sie ins amerikanische Format umwandeln und wieder in die Tabelle schreiben.
Da brauchts kein PHP, Du kannst die Änderungen auch direkt in der
Datenbank vornehmen (UPDATE).
>Anschliessend kann ich den Datentyp dann auf DATETIME setzen. Nur kenn ich
>mich leider mit Zeichenketten-Funktionen nicht gut aus. Vielleicht kann mir
>jemand ein Vorschlag machen. das wäre sehr nett.
Schau doch mal ins MySQL-Handbuch nach den Stringfunktionen. Damit
kannst Du einen gegebenen String in einzelne Bestandteile zerlegen und
wieder neu zusammensetzen. CONCAT() und SUBSTRING() helfen dabei.
Beispiel-String: 31.12.2005 12:15
Positionen der Substrings: 1 4 7 12
Längen der Substrings: 2 2 4 5
Damit ergibt sich folgendes UPDATE-Statement:
UPDATE yourTable SET dateField = CONCAT(
SUBSTRING(dateField FROM 7 FOR 4), '-', -- Jahr
SUBSTRING(dateField FROM 4 FOR 2), '-', -- Monat
SUBSTRING(dateField FROM 1 FOR 2), ' ', -- Tag
SUBSTRING(dateField FROM 12 FOR 5) -- Zeit
);
Das setzt natürlich voraus, daß alle Daten dieselbe Länge haben, d.h.
ggf. mit führenden Nullen gespeichert sind. Bei variabler Länge wird es
etwas komplizierter, da zunächst die Positionen der Trennzeichen ('.'
und ' ') bestimmt werden müssen. Aber auch dafür gibts Funktionen.
Natürlich kannst Du es auch mit PHP machen, da wären dann z.B. sscanf()
und sprintf() hilfreich, evtl. auch reguläre Ausdrücke.
Micha
Re: Zeichenketten formatieren
am 01.01.2005 16:54:55 von Gabriele Jesdinsky
31 Dec 2004 11:16:05 +0100, "Daniel Pilar" wrote:
>//wandele $datensatz[Datum] ins Format JJJJ-MM.DD HH:MM:SS und
>schreibe den Wert zurück in die Tabelle
Ich würds einfach in Excel machen und als CSV einlesen.
Mit PHP geht das z.B. so
$ergebnis=MYSQL_QUERY( "SELECT Nr,Datum FROM pwhoonline" );
while($datensatz=MYSQL_FETCH_ARRAY($ergebnis))
{
$Nr=$datensatz[Nr]; $datum=$datensatz[Datum];
$array1=explode(' ',$datum); $uhrzeit=$array1[1];
$array=explode('.',substr($datum,0,10));
$date_international=$array[2].'-'.$array[1].'-'.$array[0];
$date=$date_international.' '.$uhrzeit.':00';
$update = MYSQL_QUERY("UPDATE pwhoonline
SET Datum='$date' WHERE Nr='$Nr'");
}
Gruß Gabi
Re: Zeichenketten formatieren
am 01.01.2005 17:27:18 von Johannes Vogel
Hi Daniel, Michael
Michael Fesser wrote:
> .oO(Daniel Pilar)
>>Nun möchte ich aber das Datumsfeld in DATETIME umwandeln und dabei das
>>deutsche Datumsformat
>>ins amerikanische 2005-12-31 12:15 umwandeln. Habs dann einfacher mit
>>Rechnen mit mySQL-Datum NOW() etc..
Also vom Laien-Format ins ISO. :-)
> Das setzt natürlich voraus, daß alle Daten dieselbe Länge haben, d.h.
> ggf. mit führenden Nullen gespeichert sind. Bei variabler Länge wird es
> etwas komplizierter, da zunächst die Positionen der Trennzeichen ('.'
> und ' ') bestimmt werden müssen. Aber auch dafür gibts Funktionen.
Oft ist es einfacher, erst alle Längen gleich zu machen: Also wo nötig,
die Nullen einfügen und erst später die Umwandlung ins eigentlich
gewünschte Format zu bringen.
HTH, Johannes
Re: Zeichenketten formatieren
am 01.01.2005 17:54:37 von Niels Braczek
Gabriele Jesdinsky schrieb:
> 31 Dec 2004 11:16:05 +0100, "Daniel Pilar" wrote:
>
>> //wandele $datensatz[Datum] ins Format JJJJ-MM.DD HH:MM:SS und
>> schreibe den Wert zurück in die Tabelle
>
> Ich würds einfach in Excel machen und als CSV einlesen.
> Mit PHP geht das z.B. so
Excel?
> $ergebnis=MYSQL_QUERY( "SELECT Nr,Datum FROM pwhoonline" );
> while($datensatz=MYSQL_FETCH_ARRAY($ergebnis))
> {
> $Nr=$datensatz[Nr]; $datum=$datensatz[Datum];
^ ^ ^ ^
Da fehlen Stringbegrenzer.
> $array1=explode(' ',$datum); $uhrzeit=$array1[1];
> $array=explode('.',substr($datum,0,10));
> $date_international=$array[2].'-'.$array[1].'-'.$array[0];
>
> $date=$date_international.' '.$uhrzeit.':00';
>
> $update = MYSQL_QUERY("UPDATE pwhoonline
> SET Datum='$date' WHERE Nr='$Nr'");
> }
Dein Konstrukt gewährleistet nicht das korrekte Format.
$dateStr = '27.1.2004 23:15';
list($date, $time) = explode(' ', $dateStr);
list($d, $m, $y) = explode('.', $date);
list($h, $i) = explode(':', $time);
$dateStr = sprintf('%04d-%02d-%02s %02d:%02d:00',
$y, $m, $d, $h, $i);
stellt sicher, dass alle Teile die richtige Stellenzahl haben und ist
IMO um Einiges übersichtlicher.
MfG
Niels
--
Gib einem Hungrigen einen Fisch, und er ist für einen Tag satt.
Zeig ihm, wie man angelt, und er pöbelt Dich an, dass er besseres
zu tun hätte, als Schnüre ins Wasser hängen zu lassen.
[David Kastrup in de.comp.text.tex]
Re: Zeichenketten formatieren
am 02.01.2005 11:39:37 von Peter Marbaise
Gabriele Jesdinsky writes:
>>//wandele $datensatz[Datum] ins Format JJJJ-MM.DD HH:MM:SS und
>>schreibe den Wert zurück in die Tabelle
>
> Ich würds einfach in Excel machen und als CSV einlesen.
?? nicht jeder hat Windows oder will es benutzen und genauso sieht es
mit Excel aus.
ciao Peter
--
WWW: http://www.marbaise.de Uptime: 3 Days 3 Hours
Projekt Stadtrecht
http://www.stadtrecht.de
Re: Zeichenketten formatieren
am 04.01.2005 01:26:03 von Thomas Hamacher
Michael Fesser schrieb:
> .oO(Daniel Pilar)
>>Nun möchte ich aber das Datumsfeld in DATETIME umwandeln und dabei das
>>deutsche Datumsformat
>>ins amerikanische 2005-12-31 12:15 umwandeln. Habs dann einfacher mit
>>Rechnen mit mySQL-Datum NOW() etc..
> Da brauchts kein PHP, Du kannst die Änderungen auch direkt in der
> Datenbank vornehmen (UPDATE).
Hm, wie reagiert denn MySQL darauf, wenn du den Datentyp der Spalte von
VARCHAR(20) in DATETIME umwandelst? Ich denke mal, dass dann absoluter
Murks in der Spalte steht.
Re: Zeichenketten formatieren
am 04.01.2005 08:08:32 von Johannes Vogel
Hallo Thomas
Thomas Hamacher wrote:
> Michael Fesser schrieb:
>> .oO(Daniel Pilar)
>>> Nun möchte ich aber das Datumsfeld in DATETIME umwandeln und dabei das
>>> deutsche Datumsformat
>>> ins amerikanische 2005-12-31 12:15 umwandeln. Habs dann einfacher mit
>>> Rechnen mit mySQL-Datum NOW() etc..
>> Da brauchts kein PHP, Du kannst die Änderungen auch direkt in der
>> Datenbank vornehmen (UPDATE).
> Hm, wie reagiert denn MySQL darauf, wenn du den Datentyp der Spalte von
> VARCHAR(20) in DATETIME umwandelst? Ich denke mal, dass dann absoluter
> Murks in der Spalte steht.
Wieso meinst du, dass Michael nur eine Umwandlung von VARCHAR() nach
DATETIME meinte? Weiter unten hat er beschrieben, wie es ohne PHP geht.
Und natürlich wäre ohne Datenumwandlung eine einfache Änderung des
Attributtyps falsch.
HTH, Johannes
Re: Zeichenketten formatieren
am 04.01.2005 08:34:48 von Gabriele Jesdinsky
04 Jan 2005 01:26:03, Thomas Hamacher :
>wie reagiert denn MySQL darauf, wenn du den Datentyp der Spalte von
>VARCHAR(20) in DATETIME umwandelst?
Genialerweise eben richtig.
Vorausgesetzt, man hat vorher das Datum in die internationale Form
umgewandelt, versteht sich, sonst werden alle Daten gelöscht.
Gruß Gabi
Re: Zeichenketten formatieren
am 04.01.2005 20:36:41 von Thomas Hamacher
Johannes Vogel schrieb:
> Thomas Hamacher wrote:
>> Michael Fesser schrieb:
>>> .oO(Daniel Pilar)
>>>> Nun möchte ich aber das Datumsfeld in DATETIME umwandeln und dabei das
>>>> deutsche Datumsformat
>>> Da brauchts kein PHP, Du kannst die Änderungen auch direkt in der
>>> Datenbank vornehmen (UPDATE).
>> Hm, wie reagiert denn MySQL darauf, wenn du den Datentyp der Spalte
>> von VARCHAR(20) in DATETIME umwandelst? Ich denke mal, dass dann
>> absoluter Murks in der Spalte steht.
> Wieso meinst du, dass Michael nur eine Umwandlung von VARCHAR() nach
> DATETIME meinte? Weiter unten hat er beschrieben, wie es ohne PHP geht.
Ja genau, ich meinte nicht, das er es meinte, aber das ist das, was der
OP wollte. "Nun möchte ich aber das Datumsfeld in DATETIME umwandeln".
Meine Frage war jetzt, wie MySQL reagiert, wenn du eine VARCHAR(20)
Spalte in DATETIME umwandelst (nachdem der Inhalt wie von Michael
beschrieben umgewandelt wurde).
Re: Zeichenketten formatieren
am 04.01.2005 21:35:23 von Johannes Vogel
Hi Thomas
Thomas Hamacher wrote:
> Johannes Vogel schrieb:
>> Thomas Hamacher wrote:
>>> Michael Fesser schrieb:
>>>> .oO(Daniel Pilar)
> Ja genau, ich meinte nicht, das er es meinte, aber das ist das, was der
> OP wollte. "Nun möchte ich aber das Datumsfeld in DATETIME umwandeln".
> Meine Frage war jetzt, wie MySQL reagiert, wenn du eine VARCHAR(20)
> Spalte in DATETIME umwandelst (nachdem der Inhalt wie von Michael
> beschrieben umgewandelt wurde).
Was hindert dich, es einfach auszuprobieren?
*Glaubst* du denn den Antworten der Newsgroups?!
HTH, Johannes
Re: Zeichenketten formatieren
am 04.01.2005 22:03:12 von Thomas Hamacher
Johannes Vogel schrieb:
> Thomas Hamacher wrote:
>> Meine Frage war jetzt, wie MySQL reagiert, wenn du eine VARCHAR(20)
>> Spalte in DATETIME umwandelst (nachdem der Inhalt wie von Michael
>> beschrieben umgewandelt wurde).
> Was hindert dich, es einfach auszuprobieren?
Ich hab keinen MySQL Server zur Hand. Gut, das ist jetzt nicht dein
Problem, aber genau das hindert mich daran ;-).
> *Glaubst* du denn den Antworten der Newsgroups?!
Was soll ich glauben? Das das Statement so funktioniert bestreitet
niemand, ist ja auch offensichtlich. Vom Ändern des Datentyps hat
Michael allerdings nichts erwähnt.
Da es sich durch Gabrieles Antwort sowieso erledigt hat, hier jetzt
bitte EOD, du hast mich scheinbar falsch verstanden.
Re: Zeichenketten formatieren
am 04.01.2005 23:21:57 von Michael Fesser
.oO(Thomas Hamacher)
>Was soll ich glauben? Das das Statement so funktioniert bestreitet
>niemand, ist ja auch offensichtlich. Vom Ändern des Datentyps hat
>Michael allerdings nichts erwähnt.
Hatte ich vergessen bzw. als "aus dem Zusammenhang ersichtlich"
vorausgesetzt, denn darum ging es dem OP ja schließlich.
Es funktioniert aber wie erwartet in MySQL (getestet). Ich weiß zwar
nicht, wie MySQL das intern tatsächlich handhabt, vom Ergebnis her läßt
sich der Ablauf pro Datenfeld aber so interpretieren:
* Auslesen des Wertes
* Ändern des Datentyps
* Einfügen des Wertes
Wird also vor dem Ändern des Datentyps der Wert so verändert, daß er
auch unter dem neuen Typ einem gültigen Wert darstellt, gibt es keine
Probleme. Ein VARCHAR, der ein korrektes MySQL-Datum darstellt, läßt
sich somit problemlos in ein DATETIME überführen.
Micha