sql >> Databáze >  >> RDS >> Mysql

Jak uložím datum UTC ISO8601 do databáze MySQL?

Myslím, že ponechání hodnot data a času v poli typu DATETIME byla by to přirozená cesta.

Z vlastní zkušenosti s mou současnou PHP aplikací pouze read / write operace týkající se těchto informací mohou být problematické.

Jedno z možných řešení (za předpokladu, že používáte DATETIME datový typ) pro správné provedení celého procesu by mohl být následující přístup:

Čtení hodnot DATETIME pro použití PHP

  1. Získat DATETIME pole z vaší databáze a jejich převod v dotazu k řetězcové reprezentaci ve tvaru '2011-10-02T23:25:42Z' pomocí DATE_FORMAT Funkce MySQL s '%Y-%m-%dT%H:%i:%sZ' formátovací řetězec (dokumenty dne DATE_FORMAT )
  2. Přečtěte načtenou hodnotu sloupce v tomto specifickém formátu a převeďte ji v PHP z řetězce do reálného zobrazení data a času platného pro PHP (jako je DateTime objekty třídy a DateTime::createFromFormat daná statická metoda 'Y-m-d\TH:i:s\Z' formátovací řetězec (T a Z jsou escapovány, aby se s nimi nezacházelo jako s direktivami pro formátování) (dokumenty pro metodu ).
  3. Používejte převedené hodnoty jako hodnoty skutečného data a času se vší použitelnou logikou, jako je srovnání skutečného data (nikoli textové srovnání) atd.

Zápis data-času PHP do databáze MySQL

  1. Převést, tj. PHP DateTime class objekt podle naší normy ISO 8601 ve formátu UTC pomocí řetězce DateTime format objektu třídy metoda se stejnou jako předtím 'Y-m-d\TH:i:s\Z' formátovací řetězec (dokumentace ).
  2. Proveďte INSERT / UPDATE operace s databázovými informacemi pomocí takto připraveného řetězce jako parametru pro funkci MySQL STR_TO_DATE (s '%Y-%m-%dT%H:%i:%sZ' formátovací řetězec), který jej převede na skutečnou databázi DATETIME hodnota (dokumenty dne STR_TO_DATE ).

Ukázkový kód v PHP

Níže naleznete návrh příkladu takového přístupu pomocí objektů 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
}

Tento přístup mi hodně pomohl při provozu hodnot data-čas mezi PHP a MySQL databází.

Doufám, že to může být užitečné i pro vás.



  1. Vytvoření pole pomocí rekurzivního php z mysql

  2. Různé způsoby monitorování skupin dostupnosti serveru SQL Server AlwaysOn

  3. První písmeno velké. MySQL

  4. oracle plsql:jak analyzovat XML a vložit do tabulky