Mysql
 sql >> Database >  >> RDS >> Mysql

Come si memorizza una data ISO8601 UTC in un database MySQL?

Penso che mantenere i valori di data e ora nel campo di tipo DATETIME sarebbe un modo naturale.

Dalla mia esperienza con la mia attuale applicazione PHP, solo read / write le operazioni relative a queste informazioni potrebbero essere problematiche.

Una delle possibili soluzioni (supponendo che utilizzi DATETIME tipo di dati) per eseguire correttamente l'intero processo potrebbe essere il seguente approccio:

Lettura dei valori DATETIME per uso PHP

  1. Acquisisci DATETIME campi dal tuo database convertendoli nella query alla rappresentazione di stringhe sotto forma di '2011-10-02T23:25:42Z' utilizzando DATE_FORMAT Funzione MySQL con '%Y-%m-%dT%H:%i:%sZ' stringa di formattazione (documenti su DATE_FORMAT )
  2. Leggi il valore della colonna recuperata in questo formato specifico e convertilo in PHP da stringa in una rappresentazione di data e ora reale valida per PHP (come DateTime oggetti classe e DateTime::createFromFormat metodo statico dato 'Y-m-d\TH:i:s\Z' stringa di formattazione (T e Z vengono salvati per evitare di trattarli come direttive di formattazione) (documenti per il metodo ).
  3. Utilizza i valori convertiti come valori di data e ora reali con tutta la logica applicabile, come i confronti di date reali (non i confronti di testo), ecc.

Scrittura di data e ora PHP nel database MySQL

  1. Converti cioè PHP DateTime oggetto di classe alla nostra rappresentazione di stringa in formato UTC ISO 8601 utilizzando DateTime format dell'oggetto classe metodo con lo stesso di prima 'Y-m-d\TH:i:s\Z' stringa di formattazione (documentazione ).
  2. Esegui INSERT / UPDATE operazione sulle informazioni del database utilizzando tale stringa preparata come parametro per la funzione MySQL STR_TO_DATE (con '%Y-%m-%dT%H:%i:%sZ' formatting string) che lo converte nel database reale DATETIME valore (documenti su STR_TO_DATE ).

Esempio di codice in PHP

Di seguito è riportato un esempio di bozza di tale approccio utilizzando oggetti PDO:

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

Questo approccio mi ha aiutato molto a gestire i valori di data e ora tra PHP e database MySQL.

Spero che possa essere utile anche per te.