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

Laravel SQLSTATE [22007]:無効な日時形式:1292不正な日時値:'2019-03-1002:00:39'列'updated_at'(夏時間?)

    問題はMySQLサーバーのtime_zoneが原因であることがわかりました SYSTEMに設定されている設定 (そして私のシステムはUS Centralです)。 LaravelはすでにUTCに変換されたタイムスタンプを提供していますが、time_zoneのため、私のデータベースはそれらをUSCentralとして解釈しています。 設定。時代は実際に再び変換されています MySQLによって内部的に「実際の」UTCUNIXタイムスタンプ表現(タイムゾーンによってオフセットされているため正しくない)に変換されますが、読み取りのために再びUS Centralに変換されるため、すべてのクエリですでにUTCであるように見えます(私は正しいことを知っています。

    このため、現地時間の20:00:39(8:00 PM)のLaravelUTCタイムスタンプは02:00:39です。 MySQLはこれらの時刻を米国中部標準時として解釈します。時刻は02:00から03:00(米国中部標準時の時計がスキップされる時刻)であるため、時刻は無効です。

    Laravelアプリケーションの最善の解決策は、すべてのデータベース接続に+00:00を使用させることです。 タイムゾーン(またはconfig/app.phpでアプリケーションのタイムゾーンとして設定したもの) )したがって、二次変換は発生しません。これは、config/database.phpで実行できます。 :

    'mysql' => [
        // ...
    
        'timezone'  => '+00:00'
    ],
    

    このように、Laravelアプリケーションとは異なるタイムゾーンが構成されている場合、データベースサーバーに翻弄されることはありません。もう1つのオプションは、データベースのtime_zoneを変更することです。 設定しますが、ホストを変更したり、何らかの理由でサーバーを再構築する必要がある場合(およびタイムゾーンを再度正しく構成しない場合)、またはサーバー上の他のデータベースに影響を与える場合は、バグが再発するリスクがあります。

    重要な注意:以前のタイムスタンプはすべて、MySQLによって構成されたタイムゾーンからUTC unixタイムスタンプに内部的にオフセットされていたため(レコードはすでにUTCであったため、これも間違っていました)、データ移行を実行して修正する必要がある場合があります。古いタイムスタンプ。私のアプリケーションでは、古いタイムスタンプが数時間間違っていても問題ないため、これ以上調査していません。




    1. HubSpotODBCドライバー

    2. MySQL:フィールドを0に設定してすべての行を更新しますが、1つの行のフィールドを1に設定します

    3. p:dataTableによる行番号付け

    4. SQL Server v.Next:STRING_AGGパフォーマンス、パート2