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を使用して炎の効果を作成する方法

推薦する

CSS の位​​置属性 (absolute|relative|static|fixed) の概要と応用

まず、CSS3 Api の position 属性の定義を見てみましょう。 static: 特別な配...

Docker に Elasticsearch 7.6.2 をインストールするチュートリアル

DockerをインストールするDocker をインストールする必要がありますが、それ以上の指示はあり...

見落としがちなMySQLのCOLLATIONの例の詳細な説明

序文MySQL データベースの文字列型は、CHAR、VARCHAR、BINARY、BLOB、TEXT...

Dockerはコード検出プラットフォームSonarQubeを構築し、Mavenプロジェクトのプロセスを検出します

1 はじめに優れたコーディング習慣は優れたプログラマーが備えるべき資質ですが、コードの品質を保証する...

React は antd のアップロード コンポーネントを使用してファイル フォーム送信機能を実装します (完全なコード)

私はプロジェクトを実行するために react を使い始めたばかりで、非常に未熟で完全な初心者です。私...

スクロールバーがスペースを占有することで発生するバグを修正しました

背景このバグは滾動條占據空間ことで発生していました。いくつかの情報を確認して、ようやく解決しました。...

SQL ROW_NUMBER() および OVER() メソッドのケーススタディ

構文フォーマット: row_number() over(partition by grouping ...

スケルトンスクリーン効果を実現する CSS

ネットワーク データを読み込むときは、ユーザー エクスペリエンスを向上させるために、通常は円形の読み...

Windows10にMySQL5.6.35データベースを2つインストールする

次のように、Win10 での 2 つの MySQL5.6.35 データベースのインストールを記録しま...

CSS 等高レイアウトの一般的な方法

等高レイアウト同じ親コンテナー内の同じ高さの子要素のレイアウトを指します。等高レイアウトの実装の観点...

Jmeterはデータベースプロセスダイアグラムに接続します

1. MySQL jdbc ドライバー (mysql-connector-java-5.1.28.j...

CSS スタイルが機能しない (史上最も完全な解決策の概要)

ページを作成するときに、記述した CSS スタイルが有効にならないことがあります。この現象にはさまざ...

Nginx Httpモジュールシリーズにおけるautoindexモジュールの具体的な使用法

ブラウザ モジュールの主な機能は、http リクエスト ヘッダーの「User-Agent」の値とブラ...

Windows Server 2016 に Docker をインストールする方法

最近、Microsoft は Docker をネイティブにサポートする Windows Server...