sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo almaceno una fecha UTC ISO8601 en una base de datos MySQL?

Creo que mantener sus valores de fecha y hora en el campo de tipo DATETIME sería una especie de forma natural.

Desde mi propia experiencia con mi aplicación PHP actual, solo read / write las operaciones relacionadas con esta información pueden ser problemáticas.

Una de las posibles soluciones (asumiendo que usas DATETIME tipo de datos) para realizar correctamente todo el proceso podría ser el siguiente enfoque:

Lectura de valores DATETIME para uso de PHP

  1. Adquirir DATETIME campos de su base de datos convirtiéndolos en la consulta a la representación de cadena en forma de '2011-10-02T23:25:42Z' usando DATE_FORMAT Función MySQL con '%Y-%m-%dT%H:%i:%sZ' cadena de formato (docs el DATE_FORMAT )
  2. Lea el valor de la columna obtenida en este formato específico y conviértalo en PHP de una cadena a una representación de fecha y hora real válida para PHP (como DateTime objetos de clase y DateTime::createFromFormat método estático dado 'Y-m-d\TH:i:s\Z' cadena de formato (T y Z se escapan para evitar tratarlos como directivas de formato) (docs para el método ).
  3. Utilice valores convertidos como valores reales de fecha y hora con toda la lógica aplicable, como comparaciones de fechas reales (no comparaciones de texto), etc.

Escribir fecha y hora de PHP en la base de datos MySQL

  1. Convertir, es decir, PHP DateTime objeto de clase a nuestro ISO 8601 en representación de cadena de formato UTC usando DateTime format del objeto de clase método con el mismo que antes 'Y-m-d\TH:i:s\Z' cadena de formato (documentación ).
  2. Ejecutar INSERT / UPDATE operación en la información de la base de datos utilizando dicha cadena preparada como parámetro para la función MySQL STR_TO_DATE (con '%Y-%m-%dT%H:%i:%sZ' cadena de formato) que la convierte en una base de datos real DATETIME value (documentos el STR_TO_DATE ).

Código de ejemplo en PHP

A continuación, encontrará un borrador de ejemplo de dicho enfoque utilizando objetos 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
}

Este enfoque me ayudó mucho a operar valores de fecha y hora entre PHP y la base de datos MySQL.

Espero que también te resulte útil.