3.DATE类型
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使用以下规则解释两位年值:‘00~69’范围的年值转换为‘2000~2069’;‘70~99’范围的年值转换为‘1970~1999’。例如输入‘12-12-31’,插入数据库的日期为2012-12-31;输入‘981231’,插入数据的日期为1998-12-31。
⑶ 以YY-MM-DD或者YYMMDD数字格式表示的日期,与前面相似,00-69范围的年值转换为2000~2069;70~99范围的年值转换为1970~1999。例如输入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-DD和YYMMDD数字格式日期,SQL语句如下:
首先删除表中的数据:
DELETE FROM tmp5;
向表中插入YYYYMMDD和YYMMDD数字格式日期:
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()函数返回日期和时间值,在保存到数据库值,只保留了其日期部分。
4.DATETIME
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表示两位的年值。于前面相同‘00~69’范围的年值转换为‘2000~2069’;‘70~99’范围的年值转换为‘1970~1999’。例如输入‘12-12-31 05: 05: 05’,插入数据库的DATETIME为2012-12-31 05: 05: 05;输入‘980505 05: 05: 05’,插入数据的DATETIME为1998-05-05 05: 05: 05。
⑶ 以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期,例如输入2012123150505插入数据库的DATETIME为2012-12-31 05:05:05;输入980505050505,插入数据的DATETIME为1998-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;
向表中插入YYYYMMDDHHMMSS和YYMMDDHHMMSS数字格式日期和时间:
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”,
5.TIMESTAMP
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’,121212121212,NOW(),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:03;121212121212被转换为2012-12-12 12:12:12;NOW()被转换为系统当前日期时间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。