MySQL における Datetime と Timestamp の使用の概要

MySQL における Datetime と Timestamp の使用の概要

1. MySQL で現在の時刻を表現するにはどうすればよいでしょうか?

実際、表現方法はいろいろありますが、まとめると次のようになります。

  • 現在のタイムスタンプ
  • CURRENT_TIMESTAMP()
  • 今()
  • 現地時間
  • ローカル時間()
  • ローカルタイムスタンプ
  • ローカルタイムスタンプ()

2. TIMESTAMPとDATETIMEの比較

完全な日付形式は、YYYY-MM-DD HH:MM:SS[.fraction] です。これは、日付部分と時刻部分の 2 つの部分に分けられます。日付部分は「YYYY-MM-DD」形式に対応し、時刻部分は「HH:MM:SS[.fraction]」形式に対応します。日付フィールドでは、日付部分のみがサポートされます。時刻部分が挿入されると、その部分の内容が破棄され、警告が表示されます。

以下のように表示されます。

mysql> テーブル test(id int, hiredate date) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> テスト値に挿入(1,'20151208000000');
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> テスト値に挿入(1,'20151208104400');
クエリは正常、1 行が影響を受け、1 つの警告 (0.01 秒)
mysql> テストから * を選択します。
+------+-------------+
| ID | 雇用日 |
+------+-------------+
| 1 | 2015-12-08 |
| 1 | 2015-12-08 |
+------+-------------+
セット内の 2 行 (0.00 秒)

注: 最初のものは時間部分が0なので警告は出ません。

TIMESTAMP と DATETIME の類似点:

1> どちらも、YYYY-MM-DD HH:MM:SS[.fraction] 型の日付を表すために使用できます。

TIMESTAMP と DATETIME の違いは次のとおりです。

1> 両者の保管方法は異なる

TIMESTAMP の場合、クライアントによって挿入された時間を現在のタイムゾーンから UTC (協定世界時) に変換して保存します。クエリを実行すると、クライアントの現在のタイムゾーンに変換されて返されます。

DATETIME の場合は変更はなく、基本的にそのまま入力・出力されます。

次に検証してみましょう

まず、タイムスタンプ形式を使用するテスト テーブルと日時形式を使用するテスト テーブルを 2 つ作成します。

mysql> テーブル test(id int, hiredate timestamp) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> テスト値に挿入(1,'20151208000000');
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> テーブル test1(id int, hiredate datetime) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> test1 に値 (1,'20151208000000') を挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> テストから * を選択します。
+------+---------------------+
| ID | 雇用日 |
+------+---------------------+
| 1 | 2015-12-08 00:00:00 |
+------+---------------------+
セット内の1行(0.01秒)

mysql> test1 から * を選択します。
+------+---------------------+
| ID | 雇用日 |
+------+---------------------+
| 1 | 2015-12-08 00:00:00 |
+------+---------------------+
セット内の 1 行 (0.00 秒)

両方の出力は同じです。

次に、現在のセッションのタイムゾーンを変更します

mysql> '%time_zone%' のような変数を表示します。 
+------------------+--------+
| 変数名 | 値 |
+------------------+--------+
| システムタイムゾーン | CST |
| タイムゾーン | システム |
+------------------+--------+
セット内の 2 行 (0.00 秒)

mysql> time_zone='+0:00' を設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> テストから * を選択します。
+------+---------------------+
| ID | 雇用日 |
+------+---------------------+
| 1 | 2015-12-07 16:00:00 |
+------+---------------------+
セット内の 1 行 (0.00 秒)

mysql> test1 から * を選択します。
+------+---------------------+
| ID | 雇用日 |
+------+---------------------+
| 1 | 2015-12-08 00:00:00 |
+------+---------------------+
セット内の1行(0.01秒)

上記の「CST」は、MySQLが配置されているホストのシステム時間を指し、これは中国標準時、中国標準時UT+8:00の略語です。

結果は、test で返された時刻が 8 時間早いのに対し、test1 の時刻は変更されていないことを示しています。これにより、両者の違いが完全に検証されます。

2> 両者で保存できる時間範囲は異なる

タイムスタンプが保存できる時間の範囲は、「1970-01-01 00:00:01.000000」から「2038-01-19 03:14:07.999999」です。

datetime が保存できる時間の範囲は、「1000-01-01 00:00:00.000000」から「9999-12-31 23:59:59.999999」です。

要約: TIMESTAMP と DATETIME は、保存範囲と保存方法を除いて大きな違いはありません。もちろん、タイムゾーンをまたぐビジネスには TIMESTAMP の方が適しています。

3. TIMESTAMPとDATETIMEの自動初期化と更新

まず、次の操作を見てみましょう

mysql> テーブル test(id int, hiredate timestamp) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> test(id) に値(1) を挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> テストから * を選択します。
+------+---------------------+
| ID | 雇用日 |
+------+---------------------+
| 1 | 2015-12-08 14:34:46 |
+------+---------------------+
セット内の 1 行 (0.00 秒)

mysql> show テーブル作成 test\G
************************** 1. 行 ****************************
       表: テスト
テーブルの作成: CREATE TABLE `test` (
  `id` int(11) デフォルト NULL,
  `hiredate` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) エンジン=InnoDB デフォルト文字セット=latin1
セット内の 1 行 (0.00 秒)

少し奇妙に見えますか? hiredate フィールドを挿入しなかったため、その値は現在の値に自動的に変更されました。さらに、テーブルを作成するときに、「show create table test\G」の結果に表示される「DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP」を定義しませんでした。

実際、この機能は自動初期化と更新です。

自動初期化とは、フィールドに明示的な割り当てがない場合 (上記の例の hiredate フィールドなど)、現在のシステム時刻に自動的に設定されることを意味します。

自動更新とは、他のフィールドが変更された場合、このフィールドの値が現在のシステム時間に自動的に更新されることを意味します。

これは、「explicit_defaults_for_timestamp」パラメータに関連しています。

デフォルトでは、このパラメータの値は以下のように OFF になっています。

mysql> '%explicit_defaults_for_timestamp%' のような変数を表示します。
+---------------------------------+-------+
| 変数名 | 値 |
+---------------------------------+-------+
| タイムスタンプの明示的なデフォルト | オフ |
+---------------------------------+-------+
セット内の 1 行 (0.00 秒)

以下の公式の説明を見てみましょう。

デフォルトでは、どちらも明示的に指定されていない場合、最初の TIMESTAMP 列には DEFAULT CURRENT_TIMESTAMP と ON UPDATE CURRENT_TIMESTAMP の両方が含まれます。

多くの場合、これは私たちが望んでいることではありません。これを無効にするにはどうすればよいでしょうか?

1. 「explicit_defaults_for_timestamp」の値をONに設定します。

2. 「explicit_defaults_for_timestamp」の値がまだオフになっています。これを無効にする方法は 2 つあります。

1> DEFAULT句を使用して列のデフォルト値を指定します

2> 列に NULL 属性を指定します。

以下のように表示されます。

mysql> テーブル test1(id int、hiredate timestamp null) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> テーブル test1\G の作成を表示します
************************** 1. 行 ****************************
       表: test1
テーブルの作成: CREATE TABLE `test1` (
  `id` int(11) デフォルト NULL,
  `hiredate` タイムスタンプ NULL デフォルト NULL
) エンジン=InnoDB デフォルト文字セット=latin1
セット内の 1 行 (0.00 秒)

mysql> テーブル test2(id int、hiredate タイムスタンプ デフォルト 0) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> テーブル test2\G の作成を表示します
************************** 1. 行 ****************************
       表: test2
テーブルの作成: CREATE TABLE `test2` (
  `id` int(11) デフォルト NULL,
  `hiredate` タイムスタンプ NOT NULL デフォルト '0000-00-00 00:00:00'
) エンジン=InnoDB デフォルト文字セット=latin1
セット内の 1 行 (0.00 秒)

MySQL 5.6.5 より前では、自動初期化および更新は TIMESTAMP にのみ適用され、テーブル内の最大 1 つの TIMESTAMP フィールドでのみこの機能を使用できました。 MySQL 5.6.5 以降では、自動初期化と更新は TIMESTAMP 値と DATETIME 値の両方に適用され、値の数に制限はありません。

参照:

1. http://dev.mysql.com/doc/refman/5.6/en/datetime.html

2. http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

MySQL での Datetime と Timestamp の使用の概要に関するこの記事はこれで終わりです。MySQL Datetime と Timestamp に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL における datetime と timestamp の違いと選択
  • MySQL から Excel にテーブルデータをエクスポートする際の日時形式に関する簡単な説明
  • MySQL における datetime と timestamp の違いと使い方
  • MySQL で datetime 型のデフォルト値を設定する方法
  • MySQL データベースで datetime 型を作成する方法

<<:  NodeはMySQLに接続し、追加、削除、変更、チェックのための実装コードをカプセル化します。

>>:  CSSはコーナーカット+ボーダー+投影+コンテンツ背景色のグラデーション効果を実現します

推薦する

コード分​​析を実現するためのFastDFSとNginxの統合

FastDFSとNginxの統合:トラッカーは、負荷分散と高可用性のために Nginx と組み合わせ...

Alibaba Cloud OSS アクセス権設定(RAM 権限制御)実装

シナリオmyBuket の static/material/ ディレクトリなど、Alibaba Cl...

検索テキストボックスがフォーカスを外れたときにテキストの位置がジャンプする問題の解決方法

検索テキストボックスにテキストを設定すると、フォーカスを外すと位置がジャンプしますコードをコピーコー...

Docker を使用して Spring Boot をデプロイする方法

Docker テクノロジの開発により、マイクロサービスの実装にさらに便利な環境が提供されます。Doc...

企業サイトとコラム辞典 中国語と英語の比較 中国語と英語のバイリンガル企業サイトを作る仲間は

名前キャラクター名前キャラクター情報ニューステクノロジー技術スキンケアスキンケア補う補う香水香水化粧...

Nginx 設定ファイルの詳細な説明と最適化の提案ガイド

目次1. 概要2. nginx.conf 1) 設定ファイルの場所2) ワーカープロセス3) イベン...

マウスのドラッグ効果を実現するJavaScript

この記事では、マウスドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

CSS は Alibaba ベクター ライブラリを使用して、対応する位置に見栄えの良いアイコン効果をすばやく追加します (サンプル コード)

Alibaba ベクターアイコンライブラリにアクセスAlibaba ベクターアイコンライブラリ好き...

React Nativeでシンプルなゲームエンジンを作る

目次導入始めるReact Nativeゲームエンジンの簡単な紹介React Nativeでスネークゲ...

MySQLデータベースでスロークエリログを有効にする方法の詳細な説明

データベースはスロークエリログを有効にします設定ファイルを変更する設定ファイルmy.iniに次の2つ...

ウェブページが自動的にデュアルコアブラウザの高速モードを呼び出すようにします(Webkit)

コードサンプルヘッドタグにコード行を追加します: XML/HTML コードコンテンツをクリップボード...

MySQL挿入パフォーマンスを最適化する方法の例

MySQL パフォーマンスの最適化MySQL パフォーマンスの最適化とは、リソースを合理的に配置し、...

mysql 5.7.5 m15 winx64.zip インストール チュートリアル

win7 64 ビットで mysql-5.7.5-m15-winx64 をインストールして構成する方...

MySQLビューの原理と使用法の詳細な説明

この記事では、例を使用して MySQL ビューの原理と使用方法を説明します。ご参考までに、詳細は以下...