sql >> Database teknologi >  >> RDS >> Mysql

Hvordan gemmer jeg en UTC ISO8601-dato i en MySQL-database?

Jeg tror, ​​at du holder dine dato-tidsværdier i feltet DATETIME ville være en slags naturlig måde.

Fra min egen erfaring med min nuværende PHP-applikation, kun read / write handlinger vedrørende disse oplysninger kan være problematiske.

En af mulige løsninger (forudsat at du bruger DATETIME datatype) til korrekt udførelse af hele processen kunne være følgende tilgang:

Læsning af DATETIME-værdier til PHP-brug

  1. Hent DATETIME felter fra din database, der konverterer dem i forespørgslen til strengrepræsentation i form af '2011-10-02T23:25:42Z' ved at bruge DATE_FORMAT MySQL-funktion med '%Y-%m-%dT%H:%i:%sZ' formateringsstreng (dokumenter den DATE_FORMAT )
  2. Læs den hentede kolonneværdi i dette specifikke format, og konverter den i PHP fra streng til repræsentation af dato og klokkeslæt, der er gyldig for PHP (såsom DateTime klasseobjekter og DateTime::createFromFormat statisk metode givet 'Y-m-d\TH:i:s\Z' formateringsstreng (T og Z er escaped for at undgå at behandle dem som formateringsdirektiver) (dokumenter til metoden ).
  3. Brug konverterede værdier som reelle dato-tidsværdier med al den logik, der er relevant, f.eks. sammenligning af rigtige dato (ikke tekstsammenligninger) osv.

Skrivning af PHP dato-tid til MySQL-database

  1. Konverter dvs. PHP DateTime klasseobjekt til vores ISO 8601 i UTC-format strengrepræsentation ved hjælp af DateTime klasseobjektets format metode med det samme som før 'Y-m-d\TH:i:s\Z' formateringsstreng (dokumentation ).
  2. Udfør INSERT / UPDATE operation på databaseinformation ved hjælp af en sådan forberedt streng som en parameter for MySQL-funktionen STR_TO_DATE (med '%Y-%m-%dT%H:%i:%sZ' formateringsstreng), som konverterer den til den rigtige database DATETIME værdi (dokumenter den STR_TO_DATE ).

Eksempelkode i PHP

Nedenfor kan du finde et udkast til eksempel på en sådan fremgangsmåde ved brug af PDO-objekter:

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

Denne tilgang hjalp mig meget med at betjene dato-tidsværdier mellem PHP og MySQL-database.

Jeg håber, det kan være nyttigt for dig også.



  1. Sådan bruger du analytiske funktioner i Oracle (Overpartition efter søgeord)

  2. Hvordan implementeres Oracles JDBC-forespørgselstimeout?

  3. Sådan beregnes en kvadratrod i SQL

  4. Live chat med PHP og jQuery. Hvor skal man gemme oplysninger? Mysql eller fil?