0

MySQL数据类型—日期与时间类型2(二十四)

3DATE类型

DATE类型用在仅需要日期值时,没有时间部分,在存储时需要3个字节。日期格式为‘YYYY-MM-DD’其中YYYY表示年;MM表示月;DD表示日。在给DATE类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合DATE的日期格式即可,如下:

以‘YYYY-MM-DD’或者‘YYYYMMDD’字符串格式表示的日期,取值范围为‘1000-01-01’~‘9999-12-3’。例如输入‘2012-12-31’或者‘20121231’,插入数据库的日期都为2012-12-31

以‘YY-MM-DD’或者‘YYMMDD’字符串格式表示的日期,在这里YY表示两位的年值。包含两位年值的日期会令人模糊,因为世纪不知道。MySQL使用以下规则解释两位年值:‘0069’范围的年值转换为‘20002069’;‘7099’范围的年值转换为‘19701999’。例如输入‘12-12-31’,插入数据库的日期为2012-12-31;输入‘981231’,插入数据的日期为1998-12-31

YY-MM-DD或者YYMMDD数字格式表示的日期,与前面相似,00-69范围的年值转换为200020697099范围的年值转换为19701999。例如输入12-12-31插入数据库的日期为2012-12-31;输入981231,插入数据的日期为1998-12-31

插入CURRENT_DATE或者NOW()插入当前系统日期。

【例5.9】创建数据表tmp5,定义数据类型为DATE的字段d,向表中插入“YYYY-MM-DD”和“YYYYMMDD”字符串格式日期,SQL语句如下:

首先创建表tmp5

mysql> CREATE TABLE tmp5(d DATE);

Query OK, 0 rows affected (0.02 sec)

向表中插入“YYYY-MM-DD“和“YYYYMMDD”格式日期:

mysql> INSERT INTO tmp5 values('1998-08-08'),('19980808'),('20101010');

查看插入结果:

mysql> SELECT * FROM tmp5;

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

| d        |

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

| 1998-08-08 |

| 1998-08-08 |

| 2010-10-10 |

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

可以看到各个不同类型的日期值都正确的插入到了数据表中。

【例5.10】向tmp5表中插入“YY-MM-DD“和“YYMMDD”字符串格式日期,SQL语句如下:

首先删除表中的数据:

DELETE FROM tmp5;

向表中插入“YY-MM-DD“和“YYMMDD”格式日期:

mysql> INSERT INTO tmp5 values('99-09-09'),( '990909'), ( '000101') ,( '121212');

查看插入结果:

mysql> SELECT * FROM tmp5;

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

| d         |

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

| 1999-09-09 |

| 1999-09-09 |

| 2000-01-01 |

| 2011-11-11 |

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

【例5.11】向tmp5表中插入YY-MM-DDYYMMDD数字格式日期,SQL语句如下:

首先删除表中的数据:

DELETE FROM tmp5;

向表中插入YYYYMMDDYYMMDD数字格式日期:

mysql> INSERT INTO tmp5 values(19990909),( 990909), ( 000101) ,( 121212);

查看插入结果:

mysql> SELECT * FROM tmp5;

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

| d         |

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

| 1999-09-09 |

| 1999-09-09 |

| 2000-01-01 |

| 2011-11-11 |

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

【例5.12】向tmp5表中插入系统当前日期,SQL语句如下:

首先删除表中的数据:

DELETE FROM tmp5;

向表中插入系统当前日期:

mysql> INSERT INTO tmp5 values( CURRENT_DATE() ),( NOW() );

查看插入结果:

mysql> SELECT * FROM tmp5;

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

| d        |

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

| 2011-07-21 |

| 2011-07-21 |

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

CURRENT_DATE只返回当前日期值,不包括时间部分,NOW()函数返回日期和时间值,在保存到数据库值,只保留了其日期部分。


 

4DATETIME

DATETIME类型用在需要同时包含日期和时间信息的值,在存储时需要8个字节。日期格式为‘YYYY-MM-DD HH:MM:SS’,其中YYYY表示年;MM表示月;DD表示日;HH表示小时;MM表示分钟;SS表示秒。在给DATETIME类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合DATETIME的日期格式即可,如下:

以‘YYYY-MM-DD HH:MM:SS’或者‘YYYYMMDDHHMMSS’字符串格式表示的值,取值范围为‘1000-01-01 00:00:00’~‘9999-12-3 23:59:59’。例如输入‘2012-12-31 05: 05: 05’或者‘20121231050505’,插入数据库的DATETIME值都为2012-12-31 05: 05: 05

以‘YY-MM-DD HH:MM:SS’或者‘YYMMDDHHMMSS’字符串格式表示的日期,在这里YY表示两位的年值。于前面相同‘0069’范围的年值转换为‘20002069’;‘7099’范围的年值转换为‘19701999’。例如输入‘12-12-31 05: 05: 05’,插入数据库的DATETIME2012-12-31 05: 05: 05;输入‘980505 05: 05: 05’,插入数据的DATETIME1998-05-05 05: 05: 05

YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期,例如输入2012123150505插入数据库的DATETIME2012-12-31 05:05:05;输入980505050505,插入数据的DATETIME1998-12-31 05: 05: 05

【例5.13】创建数据表tmp6,定义数据类型为DATETIME的字段dt,向表中插入“YYYY-MM-DD HH:MM:SS”和“YYYYMMDDHHMMSS”字符串格式日期和时间值,SQL语句如下:

首先创建表tmp6

CREATE TABLE tmp6(  dt DATETIME );

向表中插入“YYYY-MM-DD HH:MM:SS”和“YYYYMMDDHHMMSS”格式日期:

mysql> INSERT INTO tmp6 values('1998-08-08 08:08:08'),('19980808080808'),('20101010101010');

查看插入结果:

mysql> SELECT * FROM tmp6;

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

| dt               |

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

| 1998-08-08 08:08:08 |

| 1998-08-08 08:08:08 |

| 2010-10-10 10:10:10 |

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

3 rows in set (0.00 sec)

可以看到各个不同类型的日期时间值都正确的插入到了数据表中。

【例5.14】向tmp6表中插入“YY-MM-DD HH:MM:SS “和“YYMMDDHHMMSS”字符串格式日期和时间值,SQL语句如下:

首先删除表中的数据:

DELETE FROM tmp6;

向表中插入“YY-MM-DD HH:MM:SS “和“YYMMDDHHMMSS’”格式日期:

mysql> INSERT INTO tmp6 values('99-09-09 09:09:09'),('990909090909'),('101010101010');

查看插入结果:

mysql> SELECT * FROM tmp6;

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

| dt                |

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

| 1999-09-09 09:09:09 |

| 1999-09-09 09:09:09 |

| 2010-10-10 10:10:10 |

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

3 rows in set (0.00 sec)

【例5.15】向tmp6表中插入YY-MM-DD HH:MM:SS YYMMDDHHMMSS数值格式日期和时间值,SQL语句如下:

首先删除表中的数据:

DELETE FROM tmp6;

向表中插入YYYYMMDDHHMMSSYYMMDDHHMMSS数字格式日期和时间:

mysql> INSERT INTO tmp6 values(19990909090909), (101010101010);

查看插入结果:

mysql> SELECT * FROM tmp6;

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

| dt                |

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

| 1999-09-09 09:09:09 |

| 2010-10-10 10:10:10 |

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

【例5.16】向tmp6表中插入系统当前日期和时间值,SQL语句如下:

首先删除表中的数据:

DELETE FROM tmp6;

向表中插入系统当前日期:

mysql> INSERT INTO tmp6 values( NOW() );

查看插入结果:

mysql> SELECT * FROM tmp6;

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

| dt                |

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

| 2011-07-21 20:28:06 |

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

NOW()函数返回当前系统的日期和时间值,格式“YYYY-MM-DD HH:MM:SS”,

 

5TIMESTAMP

TIMESTAMP的显示格式与DATETIME相同,显示宽度固定在19字符,日期格式为YYYY-MM-DD HH:MM:SS。在存储时需要4个字节,但是TIMESTAMP列的取值范围小于DATETIME的取值范围,为‘1970-01-01 00:00:01 UTC~‘2038-01-19 03:14:07 UTC,因此在插入数据时,要保证在合法的取值范围内。

【例5.17】创建数据表tmp7,定义数据类型为TIMESTAMP的字段ts,向表中插入值‘19950101010101’,‘950505050505’,‘1996-02-02 02:02:02’,‘97@03@03 03@03@03’,121212121212NOW()SQL语句如下:

CREATE TABLE tmp7( ts TIMESTAMP);

向表中插入数据:

INSERT INTO tmp7 values ('19950101010101'),

('950505050505'),

('1996-02-02 02:02:02'),

('97@03@03 03@03@03'),

(121212121212),

( NOW() );

查看插入结果:

mysql>SELECT * FROM tmp7;

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

| ts                |

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

| 1995-01-01 01:01:01 |

| 1995-05-05 05:05:05 |

| 1996-02-02 02:02:02 |

| 1997-03-03 03:03:03 |

| 2012-12-12 12:12:12 |

| 2011-07-22 09:17:49 |

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

由结果可以看到,‘19950101010101’被转换为1995-01-01 01:01:01;‘950505050505’被转换为1995-05-05 05:05:05;‘1996-02-02 02:02:02’被转换为1996-02-02 02:02:02;‘97@03@03 03@03@03’被转换为1997-03-03 03:03:03121212121212被转换为2012-12-12 12:12:12NOW()被转换为系统当前日期时间2011-07-22 09:17:49

 

【例5.18】向tmp7表中插入当前日期,查看插入值,更改时区为东10区,再次查看插入值,SQL语句如下:

首先删除表中的数据:

DELETE FROM tmp7;

向表中插入系统当前日期:

mysql> INSERT INTO tmp7 values( NOW() );

查看当前时区下日期值:

mysql> SELECT * FROM tmp7;

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

| ts                |

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

| 2011-07-22 10:02:42 |

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

查询结果为插入时的日期值,读者所在时区一般为东8区,下面修改当前时区为东10区,SQL语句如下:

mysql> set time_zone='+10:00';

再次查看插入时的日期值:

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

| ts                |

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

| 2011-07-22 12:02:42 |

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

由结果可以看到,因为东10区时间比东8区早2个小时,因此查询的结果经过时区转换之后,显示的值增加了2个小时。相同的,如果时区每减小一个值,则查询显示的日期中的小时数减1