Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie speichere ich ein UTC-ISO8601-Datum in einer MySQL-Datenbank?

Ich denke, dass Ihre Datum-Uhrzeit-Werte im Feld vom Typ DATETIME bleiben wäre eine Art natürlicher Weg.

Aus eigener Erfahrung mit meiner aktuellen PHP-Anwendung nur read / write Vorgänge bezüglich dieser Informationen können problematisch sein.

Eine der möglichen Lösungen (vorausgesetzt, Sie verwenden DATETIME Datentyp) für die ordnungsgemäße Durchführung des gesamten Prozesses könnte der folgende Ansatz sein:

Lesen von DATETIME-Werten für die PHP-Nutzung

  1. Erfassen Sie DATETIME Felder aus Ihrer Datenbank, indem Sie sie in der Abfrage konvertieren zur Zeichenfolgendarstellung in Form von '2011-10-02T23:25:42Z' durch Verwendung von DATE_FORMAT MySQL-Funktion mit '%Y-%m-%dT%H:%i:%sZ' Formatierungszeichenfolge (docs am DATE_FORMAT )
  2. Lesen Sie den abgerufenen Spaltenwert in diesem speziellen Format und konvertieren Sie ihn in PHP von einer Zeichenfolge in eine echte Datums-Zeit-Darstellung, die für PHP gültig ist (z. B. DateTime). Klassenobjekte und DateTime::createFromFormat statische Methode gegeben 'Y-m-d\TH:i:s\Z' Formatierungsstring (T und Z werden maskiert, um sie nicht als Formatierungsanweisungen zu behandeln) (docs for the method ).
  3. Verwenden Sie konvertierte Werte als echte Datum-Uhrzeit-Werte mit der gesamten anwendbaren Logik, wie echte Datumsvergleiche (keine Textvergleiche) usw.

Datum und Uhrzeit von PHP in die MySQL-Datenbank schreiben

  1. Konvertiere z.B. PHP DateTime -Klassenobjekt zu unserer ISO 8601 im UTC-Format Zeichenfolgendarstellung mit DateTime format des Klassenobjekts Methode mit der gleichen wie zuvor 'Y-m-d\TH:i:s\Z' Formatierungszeichenfolge (Dokumentation ). ).
  2. Führen Sie INSERT aus / UPDATE Operation mit Datenbankinformationen unter Verwendung einer solchen vorbereiteten Zeichenfolge als Parameter für die MySQL-Funktion STR_TO_DATE (mit '%Y-%m-%dT%H:%i:%sZ' Formatierungsstring), der ihn in die echte Datenbank DATETIME umwandelt Wert (Dokumente am STR_TO_DATE ).

Beispielcode in PHP

Nachfolgend finden Sie ein Entwurfsbeispiel für einen solchen Ansatz unter Verwendung von PDO-Objekten:

$db = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8', 'username', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    // run the query aquring 1 example row with DATETIME data 
    // converted with MySQL DATE_FORMAT function to its string representation 
    // in the chosen format (in our case: ISO 8601 / UTC)
    $stmt = $db->query("SELECT DATE_FORMAT(dt_column, '%Y-%m-%dT%H:%i:%sZ') AS formatted_dt_col"
                        ." FROM your_table LIMIT 1"); 

    if($stmt !== FALSE) {
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        // convert the acquired string representation from DB 
        // (i.e. '2011-10-02T23:25:42Z' )
        // to PHP DateTime object which has all the logic of date-time manipulation:    
        $dateTimeObject = DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $row['formatted_dt_col']);

        // the following should print i.e. 2011-10-02T23:25:42Z
        echo $dateTimeObject->format('Y-m-d\TH:i:s\Z');  

        // now let's write PHP DateTime class object '$dateTimeObject' 
        // back to the database
        $stmtInsertDT = $db->prepare("INSERT INTO your_table(dt_column) " 
                             . " VALUES ( STR_TO_DATE(:par_formatted_dt_column, '%Y-%m-%dT%H:%i:%sZ') )");

        $dtAsTextForInsert = $dateTimeObject->format('Y-m-d\TH:i:s\Z');

        // convert '$dateTimeObject' to its ISO 8601 / UTC text represantation
        // in order to be able to put in in the query using PDO text parameter
        $stmtInsertDT->bindParam(':par_formatted_dt_column', $dtAsTextForInsert, PDO::PARAM_STR);

        $stmtInsertDT->execute();

        // So the real insert query being perform would be i.e.:
        /*
           INSERT INTO your_table(dt_column) 
           VALUES ( STR_TO_DATE('2011-10-02T23:25:42Z', '%Y-%m-%dT%H:%i:%sZ') )
        */
    }
}
catch(\PDOException $pexc) {
 // serve PDOException
}
catch(\Exception $exc) {
// in case of no-PDOException, serve general exception
}

Dieser Ansatz hat mir sehr beim Betrieb von Datums- und Uhrzeitwerten zwischen PHP und MySQL-Datenbank geholfen.

Ich hoffe, es könnte auch für Sie hilfreich sein.