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はコーナーカット+ボーダー+投影+コンテンツ背景色のグラデーション効果を実現します

推薦する

vue-router からのフロントエンドルーティングの 2 つの実装

目次モードパラメータハッシュ履歴ハッシュ履歴.push()ハッシュ履歴.replace()アドレスバ...

HTML thead タグの定義と使用法の詳細な紹介

コードをコピーコードは次のとおりです。 <thead> <!– 最初の 2 行をヘ...

Win10 での MySQL 5.7 の詳細なインストールと設定のチュートリアル

1. MySQL 5.7を解凍する2. 新しい設定ファイルmy.iniを作成し、 D:\Free\m...

シンプルなアコーディオン効果を実現するjs

この記事では、アコーディオン効果を実現するためのjsの具体的なコードを参考までに共有します。具体的な...

入力ファイルの制御と美化について

一部のWebサイトでアップロードする場合、「参照」ボタンをクリックすると、[ファイルの選択]ダイアロ...

MySQL パーティションテーブルのベストプラクティスガイド

序文:パーティショニングはテーブル設計パターンです。一般的に、テーブル パーティショニングとは、条件...

IDEA が Docker を統合してリモート展開を実現するための手順

1. Dockerサーバーへのリモートアクセスを有効にするdocker が配置されているリモート サ...

CSS トランジションを使用した円形ホバー効果のサンプルコード

この記事では ソースコードのオンラインプレビューとダウンロード今日のチュートリアルでは、円のホバー効...

Reactはconetxtを通じてマルチコンポーネント値転送関数を実装します

この関数の効果はvue的provide/injectに似ています。 contextを通じて反応できる...

MySQLデータ復旧のさまざまな方法の概要

目次1. はじめに2. 直接回復2.1 mysqldumpバックアップの完全リカバリ2.2 xtra...

国内SNSのホームページを比較・分析して得た経験をみんなで共有(写真)

この記事では、ソーシャル ウェブサイトのホームページを比較分析することで洞察を得て、ソーシャル ウェ...

MySQL 8.0.12 のインストールと設定のチュートリアル

この記事はMySQL 8.0.12のインストールと設定に関する詳細なチュートリアルを記録しています。...

MySQL の連結で複数の一重引用符と三重引用符を使用する際の問題

文字列を動的に連結する場合、文字連結を使用することが多いです。次のような連結の引用符の意味がわかりま...

JSは文字列内の指定された文字列のn番目の出現位置を取得します

文字の位置を取得するための同様の方法について学習します。 charAt() 文字列内の指定された位置...

Linux で Scala 環境を構築し、簡単な Scala プログラムを書く

Linux に Scala 環境をインストールするのは非常に簡単です。Ubuntu 環境であれば、さ...