Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como armazeno uma data UTC ISO8601 em um banco de dados MySQL?


Eu acho que manter seus valores de data e hora no campo do tipo DATETIME seria meio natural.

De minha própria experiência com meu aplicativo PHP atual, apenas read / write operações relativas a esta informação podem ser problemáticas.

Uma das soluções possíveis (assumindo que você use DATETIME tipo de dados) para executar corretamente todo o processo pode ser a seguinte abordagem:

Ler valores DATETIME para uso do PHP

  1. Adquirir DATETIME campos do seu banco de dados convertendo-os na consulta para representação de string na forma de '2011-10-02T23:25:42Z' usando DATE_FORMAT Função MySQL com '%Y-%m-%dT%H:%i:%sZ' string de formatação (documentos em DATE_FORMAT )
  2. Leia o valor da coluna buscada neste formato específico e converta-o em PHP de string para representação de data e hora real válida para PHP (como DateTime objetos de classe e DateTime::createFromFormat método estático fornecido 'Y-m-d\TH:i:s\Z' string de formatação (T e Z são escapados para evitar tratá-los como diretivas de formatação) (docs for the method ).
  3. Use valores convertidos como valores de data e hora reais com toda a lógica aplicável, como comparações de data real (não comparações de texto), etc.

Escrevendo data e hora do PHP no banco de dados MySQL

  1. Converter, ou seja, PHP DateTime objeto de classe para nosso ISO 8601 em representação de string de formato UTC usando DateTime format do objeto de classe método com o mesmo de antes de 'Y-m-d\TH:i:s\Z' string de formatação (documentação ).
  2. Executar INSERT / UPDATE operação nas informações do banco de dados usando tal string preparada como parâmetro para a função MySQL STR_TO_DATE (com '%Y-%m-%dT%H:%i:%sZ' string de formatação) que o converte em banco de dados real DATETIME valor (documentos em STR_TO_DATE ).

Exemplo de código em PHP


Abaixo, encontre um rascunho de exemplo de tal abordagem usando 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
}

Essa abordagem me ajudou muito na operação de valores de data e hora entre PHP e banco de dados MySQL.

Espero que possa ser útil para você também.