MySQL日付と時刻タイプ


MySQLが時間値を表すDATEと時間タイプは、DATETIME、DATE、TIMESTAMP、TIME、YEARです.
各タイム・タイプには有効な値範囲とゼロ値があり、不正なMySQLで表示できない値を指定した場合はゼロ値が使用されます.
TIMESTAMPタイプには独自の自動更新機能があり、後述する.
 
不正な日付を挿入しようとすると、MySQLに警告またはエラーが表示されます.ALLOW_を使用可能INVALID_DATES SQLモードでは、MySQLに「1999-11-31」などの日付を受け入れさせます.「エラーの可能性がある」ユーザーがデータベースで指定した(例えば、Web形式で)将来の処理に使用する値を保存する場合に便利です.このモードでは、MySQLは月範囲が0~12、日範囲が0~31であることを確認します.これらの範囲には、MySQLがDATE列またはDATETIME列に日/月および日がゼロの日付を保存できるため、ゼロを含めることができます.これは、アプリケーションが正確な日付を知らない誕生日を保存する必要がある場合に役立ちます.この場合、日付を'1999-00-00'または'1999-01-00'に保存するだけです.このような日付を保存する場合、DATE_SUB()またはDATE_ADDなどの完全な日付が必要な関数では、正しい結果は得られません.(日付にゼロが出たくない場合は、NO_ZERO_IN_DATE SQLモードを使用します).
MySQLでは、NO_ZERO_DATE SQLモードを使用しない場合、'0000-00-00'を「疑似日付」として保存することもできます.これは、NULL値を使用するよりも便利である場合があります(データとインデックスの使用スペースが小さい場合があります).
 
日付と時刻のタイプを使用する場合は、次の点を覚えておいてください.
MySQLは、指定した日付または時間タイプの値を標準出力形式で取得しますが、指定した入力値フォーマット(日付または時間タイプに割り当てられた値または比較された値を指定した場合など)を説明するために尽力します.次の章で説明するフォーマットのみがサポートされます.あなたが有効な値を提供することを望んでいます.他のフォーマットの値を使用すると、予想外の結果が得られます.
2つの年値を含む日付は、世紀が知らないため曖昧になります.MySQLでは、次のルールを使用して2つの年の値を説明します.
70~99の範囲の年間値は1970~1999に変換されます.
00~69の範囲の年間値は2000~2069に変換されます.
MySQLは、いくつかのフォーマットの値を説明しようとしますが、日付は常に年-月-日の順序(たとえば、「98-09-04」)で、他の場所でよく使われる月-日-年または日-月-年の順序(たとえば、「09-04-98」、「04-09-98」)ではありません.
値が数値コンテキストで使用されている場合、MySQLは日付または時間タイプの値を自動的に数値に変換します.逆も同様です.
MySQLは、このセクションで説明したように、日付または時間タイプの範囲外またはそのタイプに対する不正な値に遭遇した場合に、その値をクラスの「ゼロ」値に変換します.1つの例外は、範囲外のTIME値がTIME範囲の対応する端点に切り取られることである.
次の表は、さまざまな「ゼロ」値のフォーマットを示しています.NO_を有効にするとZERO_DATE SQLモードでは、これらの値を使用すると警告が発生します.
列のタイプ
ゼロ値
DATETIME
'0000-00-00 00:00:00'
DATE
'0000-00-00'
TIMESTAMP
00000000000000
TIME
'00:00:00'
YEAR
0000
「ゼロ」の値は特殊な値ですが、表に表示される値を使用して明示的に保存または参照できます.値'0'または0を使用して保存または参照することもでき、書きやすいです.
MyODBCで使用される「ゼロ」の日付または時刻の値は、このような値を処理できないため、MyODBC 2.50.12以降のバージョンで自動的にNULLに変換されます.
 
具体的なタイプの違いはここには書かれていません.
 
また、TIMESTAMPの小さなアプリケーションをここで共有します.
 
timestampの機能は、フィールドを定義するときにdefault current_timestampとon update current_timestamp;すなわち,Item insertとupdateが記録された時刻である.
しかし、1つのテーブルに2つのフィールドが必要な場合、1つはinsertの時間を自動的に記録し、もう1つはupdateの時間を記録し、このとき定義はサポートされていません.
 
 
mysql> create table demo(demo_insert timestamp default current_timestamp,demo_updated timestamp on update current_timestamp,demo_value varchar(100));


ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
 
 
今、そのSQLを少し変えます.
mysql> create table demo(demo_insert timestamp default 0,demo_updated timestamp on update current_timestamp,demo_value varchar(100));                 
Query OK, 0 rows affected (0.02 sec)
 
 
 
これでOKです.
 
次に、適用方法について説明します.
 
mysql> show create table demo\G;
*************************** 1. row ***************************
       Table: demo
Create Table: CREATE TABLE `demo` (
  `demo_insert` timestamp NOT NULL default '0000-00-00 00:00:00',
  `demo_updated` timestamp NOT NULL default '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP,
  `demo_value` varchar(100) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=gbk
1 row in set (0.00 sec)


mysql> insert into demo (demo_insert, demo_value) values (null,'http://alex-j.iteye.com');
Query OK, 1 row affected (0.00 sec)

mysql> select * from demo;
+---------------------+---------------------+---------------------------+
| demo_insert         | demo_updated        | demo_value                |
+---------------------+---------------------+---------------------------+
| 2010-08-24 17:22:53 | 0000-00-00 00:00:00 | http://alex-j.iteye.com |
+---------------------+---------------------+---------------------------+
1 row in set (0.00 sec)


mysql> update demo set demovalue='alex-j.iteye.com';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from demo;                            
+---------------------+---------------------+--------------------+
| demo_insert         | demo_updated        | demo_value         |
+---------------------+---------------------+--------------------+
| 2010-08-24 17:22:53 | 2010-08-24 17:24:45 | alex-j.iteye.com |
+---------------------+---------------------+--------------------+
1 row in set (0.00 sec)



 
なぜこのように使えるのか、ドキュメントの説明を見てみましょう.
TIMESTAMP columns are NOT NULL by default, cannot contain NULL values, and assigning NULL assigns the current timestamp.

If you insert NULL into a TIMESTAMP column, the current date and time is inserted。

 
なぜ私たちが最初のInsert SQLを書いたのか
insert into demo (demo_insert, demo_value) values (null, 'http://alex-j.iteye.com');