sql >> Database >  >> RDS >> Mysql

Hoe sla ik een UTC ISO8601-datum op in een MySQL-database?

Ik denk dat het houden van uw datum-tijd-waarden in het veld van het type DATETIME zou een natuurlijke manier zijn.

Uit mijn eigen ervaring met mijn huidige PHP-toepassing, alleen read / write bewerkingen met betrekking tot deze informatie kunnen problematisch zijn.

Een van de mogelijke oplossingen (ervan uitgaande dat u DATETIME gebruikt) gegevenstype) voor het correct uitvoeren van het hele proces kan de volgende benadering zijn:

DATETIME-waarden lezen voor PHP-gebruik

  1. Verkrijg DATETIME velden uit uw database converteren ze in de query om representatie te stringen in de vorm van '2011-10-02T23:25:42Z' door DATE_FORMAT . te gebruiken MySQL-functie met '%Y-%m-%dT%H:%i:%sZ' opmaaktekenreeks (documenten op DATE_FORMAT )
  2. Lees de opgehaalde kolomwaarde in dit specifieke formaat en converteer deze in PHP van string naar echte datum-tijd-representatie die geldig is voor PHP (zoals DateTime class-objecten en DateTime::createFromFormat statische methode gegeven 'Y-m-d\TH:i:s\Z' opmaakreeks (T en Z worden escaped om te voorkomen dat ze als opmaakrichtlijnen worden behandeld) (docs voor de methode ).
  3. Gebruik geconverteerde waarden als echte datum-tijd-waarden met alle logica die van toepassing is, zoals echte datumvergelijkingen (geen tekstvergelijkingen), enz.

PHP date-time schrijven naar MySQL-database

  1. Converteren d.w.z. PHP DateTime class-object naar onze ISO 8601 in UTC-formaat tekenreeksrepresentatie met behulp van DateTime format van klasseobject methode met dezelfde als voorheen 'Y-m-d\TH:i:s\Z' opmaaktekenreeks (documentatie ).
  2. Voer INSERT uit / UPDATE bewerking op database-informatie met behulp van een dergelijke voorbereide string als een parameter voor de MySQL-functie STR_TO_DATE (met '%Y-%m-%dT%H:%i:%sZ' formatting string) die het converteert naar een echte database DATETIME waarde (documenten op STR_TO_DATE ).

Voorbeeldcode in PHP

Hieronder vindt u een conceptvoorbeeld van een dergelijke benadering met gebruik van PDO-objecten:

$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
}

Deze aanpak heeft me veel geholpen bij het werken met datum-tijd-waarden tussen PHP en MySQL-database.

Ik hoop dat het ook voor jou nuttig kan zijn.



  1. Toegang tot database beperken in PostgreSQL

  2. Implementeren van een hiërarchische datastructuur in een database

  3. MySQL ONLY IN() equivalente clausule

  4. Meerdere rijen invoegen in MySQL