sql >> Databasteknik >  >> RDS >> Mysql

Hur lagrar jag ett UTC ISO8601-datum i en MySQL-databas?

Jag tror att du håller dina datum-tid-värden i fältet DATETIME skulle vara ett naturligt sätt.

Från min egen erfarenhet av min nuvarande PHP-applikation, endast read / write operationer som rör denna information kan vara problematiska.

En av möjliga lösningar (förutsatt att du använder DATETIME datatyp) för att korrekt utföra hela processen kan vara följande tillvägagångssätt:

Läser DATETIME-värden för PHP-användning

  1. Hämta DATETIME fält från din databas som konverterar dem i frågan till strängrepresentation i form av '2011-10-02T23:25:42Z' genom att använda DATE_FORMAT MySQL-funktion med '%Y-%m-%dT%H:%i:%sZ' formateringssträng (dokument den DATE_FORMAT )
  2. Läs hämtat kolumnvärde i detta specifika format och konvertera det i PHP från sträng till real datum-tid-representation som är giltig för PHP (som DateTime klassobjekt och DateTime::createFromFormat statisk metod given 'Y-m-d\TH:i:s\Z' formateringssträng (T och Z undviks för att undvika att behandla dem som formateringsdirektiv) (dokument för metoden ).
  3. Använd konverterade värden som reala datum-tid-värden med all tillämplig logik, som reala datumjämförelser (inte textjämförelser) etc.

Skriva PHP-datum-tid till MySQL-databasen

  1. Konvertera dvs PHP DateTime klassobjekt till vår ISO 8601 i UTC-format strängrepresentation med DateTime klassobjektets format metod med samma som tidigare 'Y-m-d\TH:i:s\Z' formateringssträng (dokumentation ).
  2. Utför INSERT / UPDATE operation på databasinformation med en sådan förberedd sträng som en parameter för MySQL-funktionen STR_TO_DATE (med '%Y-%m-%dT%H:%i:%sZ' formateringssträng) som konverterar den till riktig databas DATETIME värde (dokument den STR_TO_DATE ).

Exempelkod i PHP

Nedan hittar du ett utkast till exempel på ett sådant tillvägagångssätt med PDO-objekt:

$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
}

Det här tillvägagångssättet hjälpte mig mycket med att använda datum-tid-värden mellan PHP och MySQL-databas.

Jag hoppas att det kan vara till hjälp för dig också.



  1. Kör en lagrad procedur i en annan lagrad procedur i SQL-servern

  2. MySQL för att ersätta med jokertecken

  3. Hur rensar man mysql-skärmkonsolen i Windows?

  4. Få polygoner nära en lat,long i MySQL