MySQL日期和时间类型
2016-02-26 20:46
691 查看
MySQL数据库中有五种与日期和时间有关的数据类型,如下表所示
类型 | 所占空间 |
---|---|
DATETIME | 8字节 |
DATE | 3字节 |
TIMESTAMP | 4字节 |
TEAR | 1字节 |
TIME | 3字节 |
DATETIME
和DATE
DATETIME占8个字节,表示的日期范围为
1000-01-01 00:00:00到
9999-12-31 23:59:59
DATE占3个字节,表示的日期范围为
1000-01-01到
9999-12-31
MySQL对日期和时间的输入格式要求非常宽松,以下都被视为日期类型
2016-02-24 21:05:00
2016/02/24 21+05+00
20160224210500
16/02/24 21@05@00PS:注意这里的
16是最近的
2016而不是其他的
1916等
MySQL5.5及之前的版本的数据库的日期类型不能精确到秒,不过
MySQL5.6.4版本开始增加了对秒的小数部分的支持,具体语法为:
type_name(fsp)
type_name可以是
TIME、
DATETIME、
TIMESTAMP。
fsp表示支持的小数部分的精度,最大为
6,表示微秒,默认为
0。对于时间函数,如
CURTIME()、
SYSDATE()、
UTC_TIMESTAMP()也增加了对
fsp的支持。
mysql> create table t( a DATETIME(2), b DATETIME); mysql> insert into t values('2016-02-24 21:27:6.5645', '2016-02-24 21:27:6.5645'); mysql> select * from t; +------------------------+---------------------+ | a | b | +------------------------+---------------------+ | 2016-02-24 21:27:06.56 | 2016-02-24 21:27:57 | +------------------------+---------------------+
TIMESTAMP
TIMESTAMP和
DATETIME显示的结果一样,都是
YYYY-MM-DD HH:MM:SS。不同的是
TIMESTAMP占
4个字节,显示的范围为
1970-01-01 00:00:00UTC到
2038-01-19 03:14:07UTC,其实际存储的是
1970-01-01 00:00:00到当前的毫秒数。
TIMESTAMP和
DATETIME除了上述的不同点之外还有以下的不同点:
1.建表时,
TIMESTAMP类型的列可以设置默认值,而
DATETIME不行。
2.更新时,可以设置
TIMESTAMP类型的列自动更新时间为当前时间。如果更新前后的数据没有改变,那么
TIMESTAMP的值也不会改变。
默认设置时间的例子:
mysql> create table t( a INT, b TIMESTAMP DEFAULT CURRENT_TIMESTAMP); mysql> insert into t(a) values(1); mysql> select * from t; +------+---------------------+ | a | b | +------+---------------------+ | 1 | 2016-02-24 22:03:13 | +------+---------------------+
更新为当前时间的例子:
mysql> create table t (a INT,b TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); Query OK, 0 rows affected (0.04 sec) mysql> insert into t(a) values(1); Query OK, 1 row affected (0.01 sec) mysql> select * from t; +------+---------------------+ | a | b | +------+---------------------+ | 1 | 2016-02-24 22:26:22 | +------+---------------------+ 1 row in set (0.00 sec) mysql> update t set a=2; Query OK, 1 row affected (0.03 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t; +------+---------------------+ | a | b | +------+---------------------+ | 2 | 2016-02-24 22:27:12 | +------+---------------------+ 1 row in set (0.00 sec) mysql> update t set a=2; mysql> select * from t; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0 +------+---------------------+ | a | b | +------+---------------------+ | 2 | 2016-02-24 22:27:12 | +------+---------------------+ 1 row in set (0.00 sec)
YEAR
和TIME
YEAR:其显示年份范围为
1901到
2155,其中之前的
YEAR(2)在
mysql5.5.27及之后的版本中废弃掉了。
TIME类型占
3个字节,显示的范围为
-838:59:59到
838:59:59。
与日期和时间相关的函数
NOW
、CURRENT_TIMESTAMP
和SYSDATE
mysql> select now(), current_timestamp(), sysdate(), sleep(2), now(), current_timestamp(), sysdate(); +---------------------+---------------------+---------------------+----------+---------------------+---------------------+---------------------+ | now() | current_timestamp() | sysdate() | sleep(2) | now() | current_timestamp() | sysdate() | +---------------------+---------------------+---------------------+----------+---------------------+---------------------+---------------------+ | 2016-02-26 20:01:58 | 2016-02-26 20:01:58 | 2016-02-26 20:01:58 | 0 | 2016-02-26 20:01:58 | 2016-02-26 20:01:58 | 2016-02-26 20:02:00 | +---------------------+---------------------+---------------------+----------+---------------------+---------------------+---------------------+ 1 row in set (2.00 sec)
注意上面返回的区别:
CURRENT_TIMESTAMP是
NOW的同义词,两者是一样的。
SYSDATE函数返回的是执行到当前函数的时间,而
NOW返回的是执行
SQL语句的时间。因此才有了上面的结果。
时间加减函数
时间加减函数有DATE_ADD(date, INTERVAL expr unit)和
DATE_SUB(date, INTERVAL expr unit),示例如下:
mysql> select now() as now, -> date_add(now(), interval 1 day) as tomorrow, -> date_sub(now(), interval 1 day) as yesterday; +---------------------+---------------------+---------------------+ | now | tomorrow | yesterday | +---------------------+---------------------+---------------------+ | 2016-02-26 20:11:52 | 2016-02-27 20:11:52 | 2016-02-25 20:11:52 | +---------------------+---------------------+---------------------+ 1 row in set (0.00 sec)
上面的例子中的
unit除了使用
DAY之外,还可以使用
YEAR,
MICROSECOND,
SECOND,
MINUTER,
HOUR,
WEEK,
MONTH等类型。
DATE_FORMAT函数
这个函数本身没有好探讨的,其示例如下所示:
[code]mysql> select date_format(now(), '%Y%m%d') as datetime;
+----------+
| datetime |
+----------+
| 20160226 |
+----------+
1 row in set (0.00 sec)
但是开发人员往往会错误地使用这个函数,导致非常严重的后果。例如:
select * from table where date_format(date, '%Y%m%d') = 'XXXX-XX-XX';
一般表都会有一个对日期类型的索引,如果使用了上述的语句,优化器绝对不会使用索引,也不可能通过索引来查询函数,因此上述查询的执行效率可能非常底。最后一句看不懂
摘抄文献
《MySQL技术内幕:SQL编程》
作者:姜承尧(DavidJiang)
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复