日期类型
Mysql提供數據類型來存儲不同種類的日期信息。在這term YYYY,MM,DD,hh,mm,and ss代表年,月,日 ,小時,分鐘,和秒。
Type ? ? ? ? ? ? ? ? ? ? ? ? ? storage Required ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Range
Date ? ? ? ? ? ? ? ? ? ? ? ? ?3bytes ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?‘1000-01-01’ to ‘9999-12-31’
Time ? ? ? ? ? ? ? ? ? ? ? ? ? 3bytes ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?‘-838:59:59’ to ? ‘838:59:59’
DATETIME ? ? ? ? ? ? ? ? 8bytes ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'1000-01-01 ? 00:00:00' ?to ?'9999-12-31 23:59:59'
TIMESTAMP ? ? ? ? 4bytes ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '1970-01-01 ? 00:00:00' to mid-year 2037
YEAR ? ? ? ? ? ? ? ? ? ? 1bytes ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1910 to 2155
這個0值表示一個格式0000-00-00對于DATE和‘00:00:00’對于TIME
日期的展示ISO 8610格式,可以改變顯示方式使用DATE_FORMAT()函數
對于日期條目:MYsql 期望接收日期類型以ISO格式,或者至少是和ISO格式相近的,那就是說日期類型必須給year-month-day的順序,盡管
1.開始的0在月和日值可以不忽略,例如2000-1-1 和2000-01-01都被認為是合法的
2.日期不符需要的不是'-';可以使用其他分隔如‘/';
3.兩個數字的日期可以被轉化為四個數字的年,你應該能夠注意基于如下規則70到99代表1970年到1999,因此00到69代表2000到2069.它是更好的提供四個數字的值來避免轉換
如果需要加載不能接受的格式,應該把他們轉換為ISO格式。
5.5.1 這DATE,TIME,DATETIME,和YEAR 日期類型
Date數據類型代表日期值在’YYYY-MM-DD‘格式。Year數據類型僅僅代表年的值,你可以聲稱列為YEAR(4)或者YEAR(2)來獲得一個4個數字或兩個數字來展示格式。如果你沒有指定展示寬度,默認器時4個數字。
5.5.2 這Timestamp數據類型
這timestamp類型存儲日期和時間類型。內部存儲是UTC,轉換為目前時間區域。這TIMESTAMP數據類型可以被初始化或被自動更新到目前的日期和時間當沒有明確的指定值。你可以指定任何單獨timestamp列在表中應該被初始化用目前的時間當記錄被創建使用insert或replace,被更新使用現在的時間當記錄被改變使用update。
知道自動初始化和更新的特征是很重要的。
這個特征能夠使用timestamp來跟蹤記錄修改的次數,但是可能是一個問題的源泉沒有意思到初始化。
為了控制初始化和更新對于timestamp,你應該增加default current——timestamp和on update——timestamp屬性在這timestamp列的定義當創建表和改變表時。這個default_timestamp屬性引發被初始化使用被創建的時間。這個on update current_timestamp 屬性引發列被更新使用目前時間當它被改變時。
為了兼容就版本的mysql,如果沒有指定default和on的屬性,mysql自動分配第一個timestamp列兩個屬性。
mysql> create table ts_test1(
? ? -> ts1 timestamp,
? ? -> ts2 timestamp,
? ? -> data char(30)
? ? -> );
Query OK, 0 rows affected (0.06 sec)
mysql> describe ts_test1;
+-------+-----------+------+-----+---------------------+-----------------------------+
| Field | Type ? ? ?| Null | Key | Default ? ? ? ? ? ? | Extra ? ? ? ? ? ? ? ? ? ? ? |
+-------+-----------+------+-----+---------------------+-----------------------------+
| ts1 ? | timestamp | NO ? | ? ? | CURRENT_TIMESTAMP ? | on update CURRENT_TIMESTAMP |
| ts2 ? | timestamp | NO ? | ? ? | 0000-00-00 00:00:00 | ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| data ?| char(30) ?| YES ?| ? ? | NULL ? ? ? ? ? ? ? ?| ? ? ??
mysql> insert into ts_test1(data) values('original_value');
Query OK, 1 row affected (0.03 sec)
mysql> select* from ts_test1;
+---------------------+---------------------+----------------+
| ts1 ? ? ? ? ? ? ? ? | ts2 ? ? ? ? ? ? ? ? | data ? ? ? ? ? |
+---------------------+---------------------+----------------+
| 2016-05-31 21:32:48 | 0000-00-00 00:00:00 | original_value |
+---------------------+---------------------+----------------+
?update ts_test1 set data='updated_value';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 ?Changed: 1 ?Warnings: 0
mysql> select* from ts_test1;
+---------------------+---------------------+---------------+
| ts1 ? ? ? ? ? ? ? ? | ts2 ? ? ? ? ? ? ? ? | data ? ? ? ? ?|
+---------------------+---------------------+---------------+
| 2016-05-31 21:33:47 | 0000-00-00 00:00:00 | updated_value |
+---------------------+---------------------+---------------+
1 row in set (0.04 sec)
如果指定:
mysql> create table ts_test2(
? ? -> created_time timestamp default current_timestamp,
? ? -> data char(30)
? ? -> );
Query OK, 0 rows affected (0.04 sec)
mysql> insert into ts_test2(data) values('original_value');
Query OK, 1 row affected (0.03 sec)
mysql> select* from ts_test2;
+---------------------+----------------+
| created_time ? ? ? ?| data ? ? ? ? ? |
+---------------------+----------------+
| 2016-05-31 21:36:42 | original_value |
+---------------------+----------------+
mysql> update ts_test2 set data='updated_value';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 ?Changed: 1 ?Warnings: 0
mysql> select* from ts_test2;
+---------------------+---------------+
| created_time ? ? ? ?| data ? ? ? ? ?|
+---------------------+---------------+
| 2016-05-31 21:36:42 | updated_value |
+---------------------+---------------+
更新也不變
mysql> create table ts_test3(
? ? -> updated_time timestamp on update current_timestamp,
? ? -> data char(30)
? ? -> );
Query OK, 0 rows affected (0.06 sec)
mysql> insert into ts_test3(data) values('original_value');
Query OK, 1 row affected (0.03 sec)
mysql> select * from ts_test3;
+---------------------+----------------+
| updated_time ? ? ? ?| data ? ? ? ? ? |
+---------------------+----------------+
| 0000-00-00 00:00:00 | original_value |
+---------------------+----------------+
1 row in set (0.03 sec)
mysql> update ts_test3 set data='updated_value';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 ?Changed: 1 ?Warnings: 0
mysql> select * from ts_test3;
+---------------------+---------------+
| updated_time ? ? ? ?| data ? ? ? ? ?|
+---------------------+---------------+
| 2016-05-31 21:42:52 | updated_value |
+---------------------+---------------+
你可以選擇使用current_timestamp 不適用或者一個或者兩個在一個timestamp列,但是不能使用default current_timestamp 在一列但是使用on update current——timestamp用在另外的一列。
可以使用如下達到目的:
mysql> create table ts_test5(
? ? -> created timestamp default 0
? ? -> ,
? ? -> updated timestamp on update current_timestamp,
? ? -> data char(30)
? ? -> );
Query OK, 0 rows affected (0.06 sec)
mysql> insert into ts_test5(created,data)
? ? -> values(null,'original_value');
Query OK, 1 row affected (0.04 sec)
mysql> slect* from ts_test5;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'slect* from ts_test5' at line 1
mysql> select* from ts_test5;
+---------------------+---------------------+----------------+
| created ? ? ? ? ? ? | updated ? ? ? ? ? ? | data ? ? ? ? ? |
+---------------------+---------------------+----------------+
| 2016-05-31 21:53:04 | 0000-00-00 00:00:00 | original_value |
+---------------------+---------------------+----------------+
1 row in set (0.03 sec)
mysql> update ts_test5 set data='updated_value';
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 ?Changed: 1 ?Warnings: 0
mysql> select* from ts_test5;
+---------------------+---------------------+---------------+
| created ? ? ? ? ? ? | updated ? ? ? ? ? ? | data ? ? ? ? ?|
+---------------------+---------------------+---------------+
| 2016-05-31 21:53:04 | 2016-05-31 21:53:48 | updated_value |
+---------------------+---------------------+---------------+
總結
- 上一篇: 非二进制字符串数据:CHAR,VARCH
- 下一篇: 12.2.12 创建有响应的用户界面 捕