日期类型

原创 2016年05月31日 21:54:51

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 |
+---------------------+---------------------+---------------+


相关文章推荐

oracle 数据类型详解---日期型

oracle 数据类型详解---日期型(转载) oracle 数据类型详解---日期型         oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据...
  • mikean
  • mikean
  • 2014年03月13日 16:44
  • 1606

java日期类型操作工具类

  • 2017年07月26日 16:13
  • 4KB
  • 下载

Java时间和日期类型的Hibernate映射

在Java中,代表时间和日期的类型包括:java.util.Date和java.util.Calendar。此外在JDBC API中还提供了3个扩展了java.util.Date类的子类:java.s...

数字中文日期货币类型互转

  • 2008年11月07日 19:56
  • 117KB
  • 下载

数据库设计中,日期字段的类型应该如何选择?

几乎大多数软件系统都需要依赖于数据库来存储数据,这些数据库大多是支持标准SQL也就是ANSISQL的,我们可以定义各种类型的字段,其中我们常常需要用一个字段来表示日期。但是在不同的数据库我们可以用不同...

多种类型日期文本框选择

  • 2016年07月11日 17:16
  • 24KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:日期类型
举报原因:
原因补充:

(最多只允许输入30个字)