Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment stocker une date UTC ISO8601 dans une base de données MySQL ?

Je pense que garder vos valeurs date-heure dans le champ de type DATETIME serait un peu naturel.

D'après ma propre expérience avec mon application PHP actuelle, seulement read / write les opérations concernant ces informations peuvent être problématiques.

Une des solutions possibles (en supposant que vous utilisez DATETIME type de données) pour exécuter correctement l'ensemble du processus pourrait être l'approche suivante :

Lecture des valeurs DATETIME pour une utilisation PHP

  1. Acquérir DATETIME les champs de votre base de données en les convertissant dans la requête à la représentation de chaîne sous la forme de '2011-10-02T23:25:42Z' en utilisant DATE_FORMAT Fonction MySQL avec '%Y-%m-%dT%H:%i:%sZ' chaîne de formatage (documents sur DATE_FORMAT )
  2. Lire la valeur de la colonne récupérée dans ce format spécifique et la convertir en PHP d'une chaîne à une représentation date-heure réelle valide pour PHP (telle que DateTime objets de classe et DateTime::createFromFormat méthode statique donnée 'Y-m-d\TH:i:s\Z' chaîne de formatage (T et Z sont échappés pour éviter de les traiter comme des directives de formatage) (docs pour la méthode ).
  3. Utilisez des valeurs converties comme des valeurs date-heure réelles avec toute la logique applicable, comme des comparaisons de dates réelles (et non des comparaisons de texte), etc.

Écrire la date et l'heure PHP dans la base de données MySQL

  1. Convertir c'est-à-dire PHP DateTime objet de classe à notre ISO 8601 dans la représentation de chaîne au format UTC en utilisant DateTime format de l'objet de classe méthode avec la même qu'avant 'Y-m-d\TH:i:s\Z' chaîne de formatage (documentation ).
  2. Effectuer INSERT / UPDATE opération sur les informations de la base de données en utilisant une telle chaîne préparée comme paramètre pour la fonction MySQL STR_TO_DATE (avec '%Y-%m-%dT%H:%i:%sZ' chaîne de formatage) qui la convertit en base de données réelle DATETIME valeur (documents le STR_TO_DATE ).

Exemple de code en PHP

Vous trouverez ci-dessous un exemple préliminaire d'une telle approche utilisant des objets 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
}

Cette approche m'a beaucoup aidé à exploiter les valeurs date-heure entre PHP et la base de données MySQL.

J'espère que cela vous sera également utile.