Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak przechowywać datę UTC ISO8601 w bazie danych MySQL?

Myślę, że zachowanie wartości daty i czasu w polu typu DATETIME byłby to naturalny sposób.

Z własnego doświadczenia z moją obecną aplikacją PHP, tylko read / write operacje dotyczące tych informacji mogą być problematyczne.

Jedno z możliwych rozwiązań (przy założeniu, że używasz DATETIME typ danych) dla prawidłowego wykonania całego procesu może być następujące podejście:

Odczytywanie wartości DATETIME dla użycia PHP

  1. Uzyskaj DATETIME pola z Twojej bazy danych, konwertując je w zapytaniu do reprezentacji ciągu w postaci '2011-10-02T23:25:42Z' używając DATE_FORMAT Funkcja MySQL z '%Y-%m-%dT%H:%i:%sZ' ciąg formatujący (dokumenty w dniu DATE_FORMAT )
  2. Odczytaj pobraną wartość kolumny w tym konkretnym formacie i przekonwertuj ją w PHP z ciągu znaków na rzeczywistą reprezentację daty i czasu poprawną dla PHP (np. DateTime obiekty klasy i DateTime::createFromFormat podana metoda statyczna 'Y-m-d\TH:i:s\Z' ciąg formatujący (T i Z są pomijane, aby uniknąć traktowania ich jako dyrektyw formatujących) (dokumentacja metody ).
  3. Użyj przekonwertowanych wartości jako rzeczywistych wartości daty i czasu z całą logiką, która ma zastosowanie, np. porównania dat rzeczywistych (nie porównania tekstów) itp.

Zapisywanie daty i godziny PHP w bazie danych MySQL

  1. Konwertuj np. PHP DateTime obiekt klasy do naszego ISO 8601 w postaci ciągu formatu UTC przy użyciu DateTime format obiektu klasy metoda taka sama jak przed 'Y-m-d\TH:i:s\Z' ciąg formatujący (dokumentacja ).
  2. Wykonaj INSERT / UPDATE operacja na informacjach bazy danych z wykorzystaniem tak przygotowanego ciągu znaków jako parametru dla funkcji MySQL STR_TO_DATE (z '%Y-%m-%dT%H:%i:%sZ' ciąg formatujący), który konwertuje go do rzeczywistej bazy danych DATETIME wartość (dokumenty dnia STR_TO_DATE ).

Przykładowy kod w PHP

Poniżej znajduje się wstępny przykład takiego podejścia z wykorzystaniem obiektów 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
}

To podejście bardzo pomogło mi w operowaniu wartościami daty i czasu między PHP a bazą danych MySQL.

Mam nadzieję, że może się to okazać pomocne również dla Ciebie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. zaimplementuj zapytanie LIKE w PDO

  2. Wartości oddzielone przecinkami w klauzuli MySQL IN

  3. wybieranie unikalnych wartości z kolumny

  4. mysql - przenieś wiersze z jednej tabeli do drugiej

  5. MySQL łączy i COUNT(*) z innej tabeli