MySQL タイムスタンプ比較クエリで遭遇する落とし穴と解決策

MySQL タイムスタンプ比較クエリで遭遇する落とし穴と解決策

タイムスタンプ比較クエリで遭遇する落とし穴

JD.com では、テーブルを作成するときに、MySQL で update_time を timestamp として設定し、create_time を datetime として設定する必要があったことを覚えています。その後、Alibaba のコーディング標準では、両方とも datetime 型である必要があると規定されました。

仕様

タイムスタンプと日付時刻の違いは、さまざまな場所で紹介されています。 JD.com では、なぜ update_time をタイムスタンプにする必要があるのか​​疑問に思うことがあります。場所を取らないからでしょうか?または、タイムスタンプのデフォルト値を設定することしかできませんか (current_timestamp の更新時)?デフォルト値のdatetimeも設定できないのでしょうか?後で Baidu で検索したところ、デフォルト値を設定するための datetime サポートは 5.7 でのみ利用可能であることがわかりました。 JD.com にこのような要件があるのは、以前使用されていた MySQL のバージョンが低すぎたため、update_time を自動的に更新する必要もあったためかもしれません。

現在、企業でもこれが求められており、update_time はタイムスタンプに設定されています。その結果、落とし穴に遭遇しました。同僚が非常に奇妙な問題を発見しました。日付比較クエリには結果がないのに、ログに出力された SQL を直接実行すると結果をクエリできるのはなぜでしょうか? ?なぜこのような矛盾が生じるのでしょうか? これまでにこのようなことは一度もありませんでした。問題を解決するのはいつも楽しいことです。

説明する

実際に現地で試してみましたが、確かにそうでした。印刷されたログに問題はありませんでしたが、私たちを「混乱」させ、非常に奇妙な気分にさせたのはログでした。確認したところ、比較されているフィールドはタイムスタンプ型の update_time であることがわかりました。 Alibabaの基準に影響されて、これはタイプの問題だと痛感しました。そこでBaiduで検索してみたところ、タイムゾーンの問題であることがわかりました。データベース接続 URL の後に serverTimezone=GMT%2B8 パラメータを追加するだけです。もちろん、別の方法としては datetime を使用することですが、これにより多くの落とし穴を回避できます。

なぜこの問題が発生するのでしょうか?これは、アプリケーション サーバーと MySQL がデプロイされているサーバーのタイム ゾーンが一致していないためです。このため、印刷ログには問題がないのに、クエリ結果が表示されません (ログに表示される時間はローカル マシンのタイム ゾーンですが、データが MySQL サーバーに転送されると、別のタイム ゾーンの時間になります)。

MySQL の日付にもこの問題があります。 。 。

タイムスタンプクエリ範囲の問題

例えばMySQLでは、更新時刻が2020-05-26の場合、クエリはupdate_time <= 2020-05-26となり、見つけることができません。DATE_FORMAT(info.up_time,'%Y-%m-%d') <= '2020-05-26'に変換する必要があります。具体的な理由は不明であり、さらなる調査が必要です。

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL の遅いクエリの落とし穴
  • mysql datetimeクエリの異常を解決する
  • MySQL がタイムスタンプを使用するときにタイムゾーンの問題を無視できるのはなぜですか?
  • タイムスタンプの差を計算するSQLメソッド

<<:  IE10 のパスワードクリアテキスト表示とクイッククリア機能を無効にする方法

>>:  CSSを使用して炎の効果を作成する方法

推薦する

Vue3 での Teleport の使用に関する詳細な説明

目次テレポートの目的テレポートの仕組みこの記事では、以下の内容を取り上げます。テレポートの目的テレポ...

VMware WorkStation 14 pro インストール Ubuntu 17.04 チュートリアル

この記事では、VMware Workstation14 ProにUBuntu17.04をインストール...

Vueにおけるキーの役割と原理の詳細な説明

目次1. 結論から始めましょう2. キーの役割2.1 例2.2 上記の例を修正する2.3 例を再度修...

vue $http の get および post リクエストのクロスドメイン問題を解決する

Vue $http get および post リクエストのクロスドメイン問題まずconfig/ind...

Linux netfilter/iptables の知識ポイントの詳細な説明

ネットフィルターNetfilter は、パケット フィルタリング、転送、およびアドレス変換 NAT ...

Vue の状態管理: Vuex の代わりに Pinia を使用する

目次1. ピニアとは何ですか? 2. Piniaは使いやすい3. ユーザーエクスペリエンス1. ピニ...

MySQL で結果を選択して更新を実行する例のチュートリアル

1. 単一テーブルクエリ -> 更新 テーブル名の更新 フィールド1=新しい値1、フィールド2...

CSS モジュールソリューション

CSS のモジュール ソリューションは、JS のモジュール ソリューションと同じくらい多く存在すると...

DIV、テーブル、XHTML のウェブサイト構築の違いの分析と説明

簡単に言えば、ウェブサイト構築とは、「この人はどんな外見をしているのか」と「この人はどんな内面を持っ...

localStorageの有効期限を設定するいくつかの方法

目次問題の説明1. 基本的な解決策2. 中間的な解決策3. 高度なソリューション4. ハードコアソリ...

SQLインジェクションの詳しい解説 - セキュリティ編(第2部)

この記事に誤りがあったり、ご提案がありましたら、お気軽にご連絡ください。よろしくお願いいたします。は...

大きな太陽の天気アイコンを純粋な CSS で記述する方法の例

効果効果図は以下のとおりです実装のアイデアDivは太陽の長方形の光と影を実現します前の疑似要素は、既...

Dockerが新しいイメージをロードした後にリポジトリとタグ名が両方ともnoneになる問題を解決する

次のコマンドを使用できます: docker tag [イメージID] [名前]:[バージョン]例えば...

HTMLページでよく使われるいくつかの小さなメソッド

<Head>タグに追加する<meta http-equiv="pragm...

JavaScriptのモジュール性を理解する方法

目次1. ブラウザのサポート2.エクスポートモジュールのエクスポート3. モジュールをインポートする...