Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để lưu trữ ngày UTC ISO8601 trong cơ sở dữ liệu MySQL?

Tôi nghĩ rằng việc giữ các giá trị ngày-giờ của bạn trong trường thuộc loại DATETIME sẽ là một cách tự nhiên.

Từ kinh nghiệm của riêng tôi với ứng dụng PHP hiện tại của tôi, chỉ read / write các hoạt động liên quan đến thông tin này có thể có vấn đề.

Một trong những giải pháp khả thi (giả sử rằng bạn sử dụng DATETIME kiểu dữ liệu) để thực hiện đúng toàn bộ quá trình có thể là cách tiếp cận sau:

Đọc các giá trị DATETIME để sử dụng PHP

  1. Có được DATETIME các trường từ cơ sở dữ liệu của bạn chuyển đổi chúng trong truy vấn biểu diễn chuỗi ở dạng '2011-10-02T23:25:42Z' bằng cách sử dụng DATE_FORMAT Hàm MySQL với '%Y-%m-%dT%H:%i:%sZ' chuỗi định dạng ( tài liệu vào DATE_FORMAT )
  2. Đọc giá trị cột đã tìm nạp ở định dạng cụ thể này và chuyển đổi nó trong PHP từ chuỗi thành biểu diễn ngày-giờ thực hợp lệ cho PHP (chẳng hạn như DateTime các đối tượng lớp và DateTime::createFromFormat phương thức tĩnh được cung cấp 'Y-m-d\TH:i:s\Z' chuỗi định dạng (TZ được thoát để tránh coi chúng là lệnh định dạng) ( tài liệu cho phương pháp ).
  3. Sử dụng các giá trị đã chuyển đổi làm giá trị ngày-giờ thực với tất cả logic có thể áp dụng, như so sánh ngày tháng thực (không phải so sánh văn bản), v.v.

Ghi date-time PHP vào cơ sở dữ liệu MySQL

  1. Chuyển đổi tức là PHP DateTime đối tượng lớp cho ISO 8601 của chúng tôi trong biểu diễn chuỗi định dạng UTC bằng cách sử dụng DateTime định dạng format với phương thức giống như trước 'Y-m-d\TH:i:s\Z' chuỗi định dạng ( tài liệu ).
  2. Thực hiện INSERT / UPDATE thao tác trên thông tin cơ sở dữ liệu bằng cách sử dụng chuỗi đã chuẩn bị như vậy làm tham số cho hàm MySQL STR_TO_DATE (với '%Y-%m-%dT%H:%i:%sZ' chuỗi định dạng) chuyển đổi nó thành cơ sở dữ liệu thực DATETIME value ( tài liệu vào STR_TO_DATE ).

Mã mẫu trong PHP

Dưới đây, vui lòng tìm một ví dụ nháp về cách tiếp cận như vậy bằng cách sử dụng các đối tượng 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
}

Cách tiếp cận này đã giúp tôi rất nhiều trong việc vận hành các giá trị ngày-giờ giữa cơ sở dữ liệu PHP và MySQL.

Tôi hy vọng nó cũng có thể hữu ích cho bạn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tên cột và bảng có phân biệt chữ hoa chữ thường trong MySQL không?

  2. Kết nối Laravel MySql DB với SSH

  3. Lỗi WAMP / MySQL không đúng ngôn ngữ

  4. Chương trình MySQL mysql_tzinfo_to_sql

  5. Cách cài đặt MySQL trên Debian 8