Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да съхраня UTC ISO8601 дата в MySQL база данни?

Мисля, че запазването на вашите стойности за дата и час в поле от тип DATETIME би било по естествен начин.

От моя собствен опит с текущото ми PHP приложение, само read / write операциите, свързани с тази информация, може да са проблематични.

Едно от възможните решения (ако приемем, че използвате DATETIME тип данни) за правилното изпълнение на целия процес може да бъде следният подход:

Четене на стойности за DATETIME за използване на PHP

  1. Получете DATETIME полета от вашата база данни, като ги преобразува в заявката към низово представяне под формата на '2011-10-02T23:25:42Z' като използвате DATE_FORMAT MySQL функция с '%Y-%m-%dT%H:%i:%sZ' форматиращ низ (документи на DATE_FORMAT )
  2. Прочетете извлечената стойност на колона в този конкретен формат и я преобразувайте в PHP от низ в реално представяне на дата и време, валидно за PHP (като DateTime клас обекти и DateTime::createFromFormat статичен метод, даден 'Y-m-d\TH:i:s\Z' форматиращ низ (T и Z са екранирани, за да се избегне третирането им като директиви за форматиране) (документи за метода ).
  3. Използвайте преобразуваните стойности като стойности за реална дата и време с цялата приложима логика, като сравнения на реални дати (не текстови сравнения) и т.н.

Записване на PHP дата-час в MySQL база данни

  1. Конвертиране, т.е. PHP DateTime обект на клас към нашия ISO 8601 в низово представяне във формат UTC с помощта на DateTime format на обекта на класа метод със същия като преди 'Y-m-d\TH:i:s\Z' форматиращ низ (документация ).
  2. Извършете INSERT / UPDATE операция с информация за база данни, използвайки такъв подготвен низ като параметър за функцията MySQL STR_TO_DATE'%Y-%m-%dT%H:%i:%sZ' форматиращ низ), който го преобразува в реална база данни DATETIME стойност (документи на STR_TO_DATE ).

Примерен код в PHP

По-долу, моля, намерете чернова пример за такъв подход с използване на 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
}

Този подход ми помогна много при работа със стойности за дата и час между PHP и MySQL база данни.

Надявам се, че може да се окаже полезно и за вас.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка при вмъкване в sql база данни с помощта на php

  2. възможно ли е да има съпоставяне на utf8 с чувствителен на акцент и регистър на главни букви в mysql?

  3. MySql:Tinyint (2) срещу tinyint (1) - каква е разликата?

  4. Записване на времева марка в mysql таблица с помощта на php

  5. MySQL:Проверете дали потребителят съществува и го пуснете