timestamp beim Auslesen ändern (date_format)?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • timestamp beim Auslesen ändern (date_format)?

    Hallo liebe Community!

    Ich bin neu im PHP-Programmieren und MySQL ist in vielerlei Hinsicht immer noch ein spanisches Dorf für mich. Ich hab eine Tabelle in der es unteranderem ein timestamp Feld gibt, in das automatisch (mit current_timestamp) die aktuelle Zeit hineingeschrieben wird. Soweit so gut.
    Der Server auf dem die Homepage liegt ist in den USA und hat MySQL 4, was mir zwei Probleme macht.

    1) Bei mir lokal (MySQL 5) sind timestamps so gespeichert: "2006-08-29 12:07:42" Das kann man schön auslesen und auch so gleich auf der Seite anzeigen. Am Server (MySQL 4) schaut das ganze so aus: "20060824114414", was natürlich nicht so toll ist vom Format her.

    2) Da der Server in den USA liegt, hat er natürlich auch eine andere Zeit. D.h. die Zeit, die er in das timestamp Feld speichert ist immer ein paar Stunden hinten.

    d.h. ich würde beim Auslesen meiner Daten gerne das Datum im timestamp (20060824114414) mit date_format oder was es da so gibt, so umändern, dass es in einer leserlichen Weise dargestellt wird und eben x Stunden (8 oder so) dazugezählt werden.

    Hier die Struktur meiner Tabelle:
    CREATE TABLE `blog` (
    `id` int(10) unsigned NOT NULL auto_increment,
    `shownr` int(10) unsigned default NULL,
    `kategorie` varchar(20) collate latin1_general_ci NOT NULL,
    `titel` varchar(100) collate latin1_general_ci NOT NULL,
    `bild` varchar(100) collate latin1_general_ci NOT NULL,
    `kurztext` varchar(500) collate latin1_general_ci NOT NULL,
    `text` varchar(10000) collate latin1_general_ci default NULL,
    `datum` timestamp NOT NULL default CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=23 ;

    und typischerweise lese ich Daten dann so aus:
    "SELECT * FROM blog WHERE kategorie='musiknews' ORDER BY datum DESC"
    und in dieser Abfrage z.B. möchte ich jetzt, dass das Datum aus dem timestamp umformatiert wird.

    Es wäre super, wenn mir hier jemand weiterhelfen könnte, weil ich keine Ahnung hab, wie ich den SQL-Query modifizieren muss, damit das klappt...

    Danke!
    C-Man

  • #2
    1) Bei mir lokal (MySQL 5) sind timestamps so gespeichert: "2006-08-29 12:07:42" Das kann man schön auslesen und auch so gleich auf der Seite anzeigen. Am Server (MySQL 4) schaut das ganze so aus: "20060824114414", was natürlich nicht so toll ist vom Format her.
    du kannst daten auch formatieren, habe ich mal gehört.

    2) Da der Server in den USA liegt, hat er natürlich auch eine andere Zeit. D.h. die Zeit, die er in das timestamp Feld speichert ist immer ein paar Stunden hinten.
    bestehen keine möglichkeiten das ganze zu lokalisieren?

    schau dir mal die Funktionen DATE_ADD() und DATE_FORNAT() an.

    Kommentar


    • #3
      Hi!

      Danke für die Antwort. Lokalisieren geht leider nicht, hab zumindest bis jetzt nix gefunden bei meinem Provider.
      Mit Date_Add und Date_Format hab ich mich schon herumgespielt, aber ich hab es nicht geschafft diese Parameter so in meine SELECT Abfragen einzubauen, damits auch funktioniert :-(

      lg
      C-Man

      Kommentar


      • #4
        Schau Dir mal die MySQL-Funktion
        FROM_UNIXTIME(unix_timestamp,format)
        an. (MySQL-Docs )
        Zeitstempel + 8h und Originalzeit könnten so abgefragt werden
        Code:
        SELECT
        FROM_UNIXTIME( (`datum` + 28800) ) AS NEWTIME,
        FROM_UNIXTIME( `datum` ) AS OLDTIME
        FROM `blog`
        WHERE 1
        Mit dem Format-Parameter kannst Du noch das Datums-Format anpassen.

        Kommentar


        • #5
          Aber wenn ich das so mache, wie du schreibst, also
          SELECT
          FROM_UNIXTIME( (`datum` + 28800) ) AS NEWTIME,
          FROM_UNIXTIME( `datum` ) AS OLDTIME
          FROM `blog`
          WHERE 1

          liest er dann nicht nur das Datumsfeld aus? Weil SELECT * sagt doch, dass er alles auslesen soll, oder? (was ich ja auch will)
          Wenn ich jetzt aber SELECT FROM_UNIXTIME ... mache tut er das ja nicht.

          tut leid, aber in SQL kenn ich mich wie gesagt noch nicht wirklich aus :-(

          lg
          C-Man

          Kommentar


          • #6
            Warum sollte man bei einem MYSQL-Timestamp mit der Funktion FROM_UNIXTIME arbeiten??? Dass man da eine total falsche Zeit bekommt, liegt wohl auf der Hand, oder meinst du nicht?
            OffTopic:
            Wer lesen kann, ist klar im Vorteil. :P


            Mit Date_Add und Date_Format hab ich mich schon herumgespielt, aber ich hab es nicht geschafft diese Parameter so in meine SELECT Abfragen einzubauen, damits auch funktioniert :-(
            Wow, mit so einer Aussage, kann man arbeiten. Was erwartest du? Den Fertigen code? Poste deine Ansätze und die Selle, an der du scheiterst.

            Kommentar


            • #7
              liest er dann nicht nur das Datumsfeld aus? Weil SELECT * sagt doch, dass er alles auslesen soll, oder? (was ich ja auch will)
              erwarte bitte nicht, dass du fertigen code erhältst. dann müsstest du dich bitte an eine agentur wenden. Ohne grundlagen und selbstständiges denken wird das hier nichts.

              und zum UNIX- vs. mySQL-Timestamp hatte ich ja grade was geschrieben. Das konntest du nur noch nicht lesen

              Kommentar


              • #8
                Original geschrieben von TobiaZ
                Warum sollte man bei einem MYSQL-Timestamp mit der Funktion FROM_UNIXTIME arbeiten??? Dass man da eine total falsche Zeit bekommt, liegt wohl auf der Hand, oder meinst du nicht?
                Sorry, war echt mein Fehler, das wäre natürlich nur relevant, wenn die Zeit als UNIX_TIMESTAMP gespeichert wird. Habe ich beim Lesen getrieft ... peinlich!!! ...

                Also drehen wir die ganze Geschichte mal um ;-)
                @ cManBlues: Vielleicht solltest Du in Erwägung ziehen, das Datum in einem Format zu speichern, welches die spätere Formatierung vereinfacht. Und das ist - zumindest meiner Meinung nach - u.a. der Unix-Zeitstempel, auf dem letztendlich viele Zeitoperationen basieren.
                Somit hast Du alle Freiheiten, um sowohl Formatierungen, Internationalisierungen und mathematische Operationen schnell und einfach anzupassen.

                Wie gesagt, dass ist meine Meinung zum Speichern von Zeitangaben, mit denen später noch "gearbeitet" werden muss.

                Zur SELECT-Anweisung:
                In dem Fall, dass Du mit einzelnen Feldern innerhalb der Select-Anweisung Operationen durchführen möchtest (wie in meinem Beispiel), kannst Du SELECT * nicht verwenden sondern musst die abzufragenden Felder auflisten.
                Ansonsten solltest Du Dir vielleicht die Datums-/Zeitfunktionen von PHP anschauen.

                Kommentar


                • #9
                  @Guido: Nimms mir nicht übel, aber irgendwann muss ich hier mal nen Riegel vorschieben. Kein Wunder, dass immer mehr User
                  echo "" . $var . "";
                  schreiben. Nur so zum Beispiel.

                  Daten im Unix-Time Format zu speichern ist in den meisten fällen schwachsinn und überflüssig. Also nicht einfach unüberlegt hier empfehlen.

                  Wie willst du mit MySQL damit rechnen? Richtig. GAR NICHT!

                  Du musst immer den Umweg über FROM_UNIXTIME() gehen. Und was da rauskommt, ist - man höre und staune - Das MySQL Date Format. Super. das hätten wir einfacher haben können. Nämlich indem wir im DATE_TIME oder im TIMESTAMP Format speichern (mehr zu den Unterschieden im Manual).

                  Ich hoffe, die anderen machen nicht die selben Fehler wie du und vielleicht konnte ich dich umstimmen.

                  In dem Fall, dass Du mit einzelnen Feldern innerhalb der Select-Anweisung Operationen durchführen möchtest (wie in meinem Beispiel), kannst Du SELECT * nicht verwenden sondern musst die abzufragenden Felder auflisten.
                  Auch das ist so nicht 100% korrekt. Man kann (soll natürlich auf keinen Fall) weiterhin das * benutzen und mittels Komma(,) explizit weitere formatierte Angaben Selectieren:

                  SELECT *, DATE_FORMAT(...) new_date FROM...

                  Ansonsten solltest Du Dir vielleicht die Datums-/Zeitfunktionen von PHP anschauen.
                  Spätestens jetzt hört es aber auf mit dem Spaß. Warum sollte man PHP bemühen, wenn MySQL das alles schon beim Selektieren verarbeiten kann. Okay, bei deinem Unix-Timestamp bietet es sich an.

                  Kommentar


                  • #10
                    ähmmm, ja...

                    also, zu aller erst mal: wie bereits erwähnt bin ich leider kein Profi und suche deswegen Hilfe. Dass ich allerdings keine Grundlagen habe und nicht selbständig denken kann, möchte ich allerdings zurückweisen.
                    Ich hab in den letzten zwei Wochen folgende Seite komplett selbst gestaltet und HÄNDISCH programmiert (http://www.uradiovienna.com/uradio16d/ is alles noch ein Test),
                    obwohl ich vorher keine Ahnung von PHP oder Mysql hatte. Soviel dazu.
                    Ich hatte mir gedacht hier Hilfe zu finden und nicht blöd von der Seite angemacht zu werden. Hier mein ich TobiaZ und nicht Guido. TobiaZ, anscheinend kennst du
                    dich ja sehr gut aus, schliesslich kritisierst du ja auch Guidos Vorschläge bis ins kleinste Detail! *kopfschüttel*
                    Ich habe keine Ahnung, warum du die Zeit und Energie nicht dafür verwendest mir zu sagen, wo ich in meinem oben angeführten SELECT Query das Date_Format einfügen muss, damit das ganze funktioniert. Ich kenne mich wie gesagt mit der SQL Syntax noch nicht wirklich aus, bin aber bereit zu lernen (was ich ja seit Wochen bereits mache).
                    Ich frage mich nur, wozu solche Foren denn da sind, wenn einem dann nur unfreundlich mitgetielt wird, wieviel man zwar selber weiß, aber nicht weitergeben will.
                    Googeln kann ich selber auch...

                    @Guido: Danke für deine Tipps, werd mal herumprobieren.

                    Kommentar


                    • #11
                      Jo, wer nicht will der hat schon. Aber irgendwann wirst vielleicht auch du meine Argumentation nachvollziehen können. Vielleicht.

                      PS: Du hast aber schon mitbekommen, dass der großteil meiner Kritik an die Lösungsvorschläge von Guido gingen. Und auch ihn wollte ich nicht fertig machen.

                      Dass ich [...] nicht selbständig denken kann, möchte ich allerdings zurückweisen.
                      Versuch mir jetzt bitte nicht zu erzählen, dass du den code von Guido verstanden hast und nicht einfach blind in dein Programm reingehämmert hast. Dann hätte sich deine Fragestellung wohl nicht ergeben.

                      Kommentar


                      • #12
                        jaja, das hab ich schon mitbekommen, aber wie gesagt, anstatt Guidos Posting bis ins letzte Detail als falsch zu deklarieren, würde ich die Zeit und Energie nutzen, um eine Antwort auf das eigentliche Problem zu finden... find ich ein wenig komisch.
                        Den SELECT Query von Guido verstehe ich so:
                        Ich selectiere die Elemente aus der Spalte 'datum' (aus der tabelle 'blog') und rechne zu dem Wert, der als UNIX-Zeit in der Spalte OLDTIME ausgegeben wird 28800 Sekunden dazu, was 8 Stunden entspricht und gebe diese Zeiten in der Spalte NEWTIME aus.
                        Soweit so gut. Was mich aber interessiert ist, wie ich, wenn ich mit SELECT * etc. alle Daten aus der Tabelle auslese, den Wert im Feld 'datum' verändere. Und da ich die Syntax noch nicht so ganz verstehe (es muss mir sozusagen erst der Knopf aufgehen, wenn dir das was sagt) weiß ich eben nicht, wie ich den Vorschlag von Guido in mein SELECT * Query einbauen soll.

                        Kommentar


                        • #13
                          Original geschrieben von TobiaZ
                          PS: Du hast aber schon mitbekommen, dass der großteil meiner Kritik an die Lösungsvorschläge von Guido gingen. Und auch ihn wollte ich nicht fertig machen.
                          Habe ich auch nicht so verstanden - zumal mir die Freiheit bleibt, meine Zeit zu speichern, wie ich gern möchte ;-)

                          Kommentar


                          • #14
                            Probier mal
                            Code:
                            SELECT
                            DATE_FORMAT( DATE_ADD( `datum` , INTERVAL 8 HOUR ) , '%d. %m. %Y, %H:%i:%s' )
                            FROM  ...
                            Klappte bei mir in MySQL 4.1 und 5.0 eigentlich prima.

                            @TobiaZ : OK, geht auch und ist flink ...

                            Kommentar


                            • #15
                              Aber wo ist die Unix Time? :P

                              Kommentar

                              Lädt...
                              X