Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menyimpan tanggal UTC ISO8601 dalam database MySQL?

Saya pikir menjaga nilai tanggal-waktu Anda di bidang tipe DATETIME akan menjadi cara yang alami.

Dari pengalaman saya sendiri dengan aplikasi PHP saya saat ini, hanya read / write operasi terkait informasi ini mungkin bermasalah.

Salah satu solusi yang mungkin (dengan asumsi Anda menggunakan DATETIME tipe data) untuk melakukan seluruh proses dengan benar dapat dilakukan dengan pendekatan berikut:

Membaca nilai DATETIME untuk penggunaan PHP

  1. Dapatkan DATETIME bidang dari database Anda mengonversinya dalam kueri untuk representasi string dalam bentuk '2011-10-02T23:25:42Z' dengan menggunakan DATE_FORMAT Fungsi MySQL dengan '%Y-%m-%dT%H:%i:%sZ' format string (dokumen pada DATE_FORMAT )
  2. Baca nilai kolom yang diambil dalam format khusus ini dan ubah dalam PHP dari string menjadi representasi tanggal-waktu nyata yang valid untuk PHP (seperti DateTime objek kelas dan DateTime::createFromFormat metode statis yang diberikan 'Y-m-d\TH:i:s\Z' memformat string (T dan Z diloloskan untuk menghindari memperlakukannya sebagai arahan pemformatan) (dokumen untuk metode ).
  3. Gunakan nilai yang dikonversi sebagai nilai waktu-tanggal nyata dengan semua logika yang berlaku, seperti perbandingan tanggal sebenarnya (bukan perbandingan teks), dll.

Menulis waktu-waktu PHP ke database MySQL

  1. Konversi yaitu PHP DateTime objek kelas ke ISO 8601 kami dalam representasi string format UTC menggunakan DateTime format objek kelas dengan metode yang sama seperti sebelumnya 'Y-m-d\TH:i:s\Z' memformat string (dokumentasi ).
  2. Lakukan INSERT / UPDATE operasi pada informasi database menggunakan string yang telah disiapkan sebagai parameter untuk fungsi MySQL STR_TO_DATE (dengan '%Y-%m-%dT%H:%i:%sZ' format string) yang mengubahnya menjadi basis data nyata DATETIME nilai (dokumen pada STR_TO_DATE ).

Contoh kode dalam PHP

Di bawah ini silakan temukan contoh draf pendekatan tersebut menggunakan objek 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
}

Pendekatan ini banyak membantu saya dalam mengoperasikan nilai tanggal-waktu antara PHP dan database MySQL.

Saya harap ini dapat membantu Anda juga.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Koneksi ke MySQL dari .NET menggunakan SSH.NET Library

  2. Django :mysql :1045, Akses ditolak untuk pengguna

  3. Nama indeks tidak terdefinisi

  4. bagaimana cara mengisi nilai kolom mysql berdasarkan rumus?

  5. apakah baik menyimpan nilai desimal sebagai varchar di mysql?