0

MySQL数据类型—日期与时间类型1(二十三)

5.1.3  日期与时间类型

MySQL中有多种表示日期的数据类型,主要有:DATETIMEDATETIMESTAMPTIMEYEAR。例如,当只记录年信息的时候,可以只是用YEAR类型,而没有必要使用DATE。每一个类型都有合法的取值范围,当指定确实不合法的值时系统将“零”值插入到数据库中。本节将介绍MySQL日期和时间数据类型的使用方法。【表5.4】列出了MySQL中的日期与时间类型。

5.4 日期/时间数据类型

类型名称

日期格式

日期范围

存储需求

YEAR

YYYY

19012155

1字节

TIME

HH:MM:SS

-838:59:59 838:59:59

3字节

DATE

YYYY-MM-DD

1000-01-019999-12-3

3字节

DATETIME

YYYY-MM-DD HH:MM:SS

1000-01-01 00:00:009999-12-31 23:59:59

8字节

TIMESTAMP

YYYY-MM-DD HH:MM:SS

1970-01-01 00:00:01 UTC 2038-01-19 03:14:07 UTC

4字节

1YEAR

YEAR类型用一个单字节类型用于表示年,在存储时只需要1个字节。可以用各种格式指定YEAR值,如下:

4位字符串或者四位数字格式表示的YEAR,范围为‘1901’~‘2155’。输入格式为‘YYYY’或者YYYY,例如,输入2010或‘2010’,插入到数据库的值均为2010

2位字符串格式表示的YEAR,范围为‘00’到‘99’。‘00'~‘69’和‘70’~‘99’范围的值分别被转换为2000206919701999范围的YEAR值。‘0’与‘00’的作用相同。插入超过取值范围的值将被转换为0000

2位数字表示的YEAR,范围为1991697099范围的值分别被转换为2001206919701999范围的YEAR值。注意:在这里0值将被转换为0000,而不是2000

 

【例5.3】创建数据表tmp3,定义数据类型为YEAR的字段y,向表中插入值2010,‘2010’,‘2166’,SQL语句如下:

首先创建表tmp3

CREATE TABLE tmp3(  y YEAR );

向表中插入数据:

mysql> INSERT INTO tmp3 values(2010),('2010'),('2166');

Query OK, 3 rows affected, 1 warning (0.00 sec)

Records: 3  Duplicates: 0  Warnings: 1

语句执行之后,MySQL给出了一条警告,使用SHOW查看警告信息:

mysql> SHOW WARNINGS;

+---------+------+----------------------------------------------+

| Level   | Code | Message                       |

+---------+------+----------------------------------------------+

| Warning | 1265 | Data truncated for column 't' at row 3 |

+---------+------+----------------------------------------------+

1 row in set (0.00 sec)

可以看到,插入的第三个值2166超过了YEAR类型的取值范围,此时可以正常的执行插入操作,但是插入的结果却发生了变化,查看结果:

mysql> SELECT * FROM tmp3;

+------+

| y    |

+------+

| 2010 |

| 2010 |

| 0000 |

+------+

由结果可以看到,当插入值为数值类型的2010或者字符串类型的‘2010’时,都正确的储存到了数据库中,当插入值‘2166’时,超出了YEAR类型的取值范围,因此,插入值为0000

【例5.4】向tmp3表中y字段插入2位字符串表示的YEAR值,分别为‘0’、‘00’、‘77’和‘10’,SQL语句如下:

首先删除表中的数据:

DELETE FROM tmp3;

向表中插入数据:

INSERT INTO tmp3 values('0'),('00'),('77'),('10');

查看结果:

mysql> SELECT * FROM tmp3;

+------+

| y    |

+------+

| 2000 |

| 2000 |

| 1977 |

| 2010 |

+------+

由结果可以看到,字符串‘0’和‘00’的作用相同,分别都转换成了2000年;‘77’转换为1977;‘10’转换为2010

【例5.5】向tmp3表中y字段插入2位数字表示表示的YEAR值,分别为07811SQL语句如下:

首先删除表中的数据:

DELETE FROM tmp3;

向表中插入数据:

INSERT INTO tmp3 values(0),(78),(11);

查看结果:

mysql> SELECT * FROM tmp3;

+------+

| y    |

+------+

| 0000 |

| 1978 |

| 2011 |

+------+

由结果可以看到,0被转换为000078被转换为197811被转换为2011
 

2TIME

TIME类型用在只需要时间信息的值,在存储时需要3个字节。格式为:HH:MM:SSHH表示小时;MM表示分钟;SS表示秒。TIME类型的取值范围为-838:59:59 838:59:59,小时部分会如此大的原因是TIME类型不仅可以用于表示一天的时间(必须小于24小时),还可能为某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时,或者甚至为负)。可以用各种格式指定TIME值,如下:

D HH:MM:SS’格式的字符串。还可以使用下面任何一种“非严格”语法:‘HH:MM:SS’、‘HH:MM’、‘D HH:MM’、‘D HH’或‘SS’。这里D表示日,可以取034之间的值。在插入数据库时,D被转换为小时保存,格式为 D*24 + HH”。

⑵‘HHMMSS’格式的没有间割符的字符串或者HHMMSS格式的数值,假定是有意义的时间。例如:‘101112’被理解为‘10:11:12’,但‘109712’是不合法的(它有一个没有意义的分钟部分),存储时将变为00:00:00

 

【例5.6】创建数据表tmp4,定义数据类型为TIME的字段t,向表中插入值‘10:05:05’,‘23:23’,‘2 10:10’,‘3 02’,‘10’,SQL语句如下:

首先创建表tmp4

CREATE TABLE tmp4( t TIME );

向表中插入数据:

mysql> INSERT INTO tmp4 values('10:05:05 '), ('23:23'), ('2 10:10'), ('3 02'),('10');

查看结果:

mysql> SELECT * FROM tmp4;

+----------+

| t       |

+----------+

| 10:05:05 |

| 23:23:00 |

| 58:10:00 |

| 74:00:00 |

| 00:00:10 |

+----------+

由结果可以看到,‘10:05:05’被转换为10:05:05;‘23:23’被转换为23:23:00;‘2 10:10’被转换为58:10:00,‘3 02’被转换为74:00:00;‘10’被转换成00:00:10

 

【例5.7】表tmp4中插入值‘101112’,111213,0’,107010SQL语句如下:

首先删除表中的数据:

DELETE FROM tmp4;

向表中插入数据:

mysql>INSERT INTO tmp4 values('101112'),(111213),( '0') ,( 107010);

Query OK, 4 rows affected, 1 warning (0.00 sec)

Records: 4  Duplicates: 0  Warnings: 1

可以看到在插入数据时,MySQL给出了一个警告信息,使用SHOW WARNINGS;查看警告信息:

mysql> show warnings;

+---------+------+--------------------------------------------------+

| Level   | Code | Message                          |

+---------+------+--------------------------------------------------+

| Warning | 1264 | Out of range value for column 't' at row 4 |

+---------+------+-----------------------------------------------------+

可以看到,在插入第4条记录的时候,数据超出了范围,原因是107010的小时部分超过了60,二小时是不会超过60的,查看结果:

mysql> SELECT * FROM tmp4;

+----------+

| t       |

+----------+

| 10:11:12 |

| 11:12:13 |

| 00:00:00 |

| 00:00:00 |

+----------+

由结果可以看到,‘101112’被转换为10:11:12111213被转换为11:12:13;‘0’被转换为00:00:00107010因为是不合法的值,因此被转换为00:00:00

也可以是用系统日期函数向TIME字段列插入值。

【例5.8】向tmp4表中插入系统当前时间,SQL语句如下:

首先删除表中的数据:

DELETE FROM tmp4;

向表中插入数据:

mysql> INSERT INTO tmp4 values (CURRENT_TIME) ,(NOW());

查看结果:

mysql> SELECT * FROM tmp4;

+----------+

| t       |

+----------+

| 08:43:51 |

| 08:43:51 |

+----------+

由结果可以看到,获取系统当前的日期时间插入到TIME类型列,因为读者输入语句的时间不确定,因此获取的值与这里的可能是不同。但都是系统当前的日期时间值。