sql >> データベース >  >> RDS >> Mysql

UTC ISO8601の日付をMySQLデータベースに保存するにはどうすればよいですか?

    タイプDATETIMEのフィールドに日時の値を保持すると思います 自然な方法です。

    現在のPHPアプリケーションでの私自身の経験から、 readのみ /書き込み この情報に関する操作には問題がある可能性があります。

    考えられる解決策の1つ( DATETIME を使用すると仮定) プロセス全体を適切に実行するためのデータ型)は、次のアプローチである可能性があります。

    PHPで使用するDATETIME値の読み取り

    1. DATETIMEを取得します データベースのフィールドをクエリで変換します '2011-10-02T23:25:42Z'の形式で文字列表現に DATE_FORMATを使用する '%Y-%m-%dT%H:%i:%sZ'を使用したMySQL関数 フォーマット文字列( DATE_FORMATに関するドキュメント
    2. フェッチされた列の値をこの特定の形式で読み取り、PHPで文字列からPHPで有効な実際の日時表現( DateTime など)に変換します。 クラスオブジェクトとDateTime::createFromFormat 'Y-m-d \ TH:i:s \Z'で指定された静的メソッド フォーマット文字列( T およびZ フォーマットディレクティブとして扱われないようにエスケープされます)( メソッドのドキュメント
    3. 変換された値を実際の日時値として使用し、実際の日付の比較(テキスト比較ではない)など、適用可能なすべてのロジックを使用します。

    MySQLデータベースへのPHP日時の書き込み

    1. 変換、つまりPHP DateTime DateTimeを使用したUTC形式の文字列表現でのISO8601へのクラスオブジェクト クラスオブジェクトのformat 以前と同じメソッド'Y-m-d\ TH:i:s \ Z' フォーマット文字列( ドキュメント
    2. INSERTを実行します / UPDATE MySQL関数STR_TO_DATEのパラメータとして準備された文字列を使用したデータベース情報の操作 ('%Y-%m-%dT%H:%i:%sZ'を使用 書式設定文字列)実際のデータベースに変換します DATETIME 値( STR_TO_DATEに関するドキュメント

    PHPのサンプルコード

    以下に、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
    }
    

    このアプローチは、PHPとMySQLデータベースの間で日時値を操作するのに大いに役立ちました。

    それがあなたにも役立つことを願っています。



    1. 5種類のデータベース修復

    2. あなたのビジネスで利用可能なトップデータベースモニタリングオプション

    3. SQLServerの論理AND演算子とは-SQLServer/TSQLチュートリアルパート120

    4. MariaDBのWEEKDAY()とDAYOFWEEK():違いは何ですか?