Mysql日期(DATE, TIME, DATETIME, TIMESTAMP)类型的比较

最近发现自己一直以来经常用一种错误的方法在比较日期,例如一下语句,a字段是一个DATETIME类型的列:

select a from t1 where DATEDIFF(a, '2018-09-11') < 0;

该语句是为了查出2018-09-11 日期之前的所有记录,但这个语句有个问题,如果a字段加了索引,用这种类型进行日期对比,会导致查询不走索引,从而使查询性能下降。

看了Mysql关于日期字段对比的文档。在进行日期比较的时候,mysql会自动将日期转换成数字进行比较。where条件后,使用字符串格式日期与DATE,DATETIME,TIMESTAMP,TIME类型字段进行比较的时候,对字符串格式要求不严格,你可以使用任意格式的分隔符来表示日期,例如"2018-09-11","2018#09#11","2018&09&11"对于mysql来说,都是相同的日期。如果没有分隔符,例如"20180911",与"2018-09-11"或其他有分隔符的日期,也是相同的。例如下图

select a from t1 where a < '2018#09#11';

与

select a from t1 where a < '2018-09-11';

与

select a from t1 where a < '20180911';

所代表的意义是相同的,都是查询日期小于2018年9月11日的数据
也就是说上图的查询语句,完全可以重写为,这么做的好处?就是会使用索引,是查询更快

select a from t1 where a < '2018-09-11';

当将日期类型字段与字符串型日期进行<,>,>=,<=,between比较的时候,Mysql会将字符串类型日期转换成长整型数字进行比较,从而加快查询速度。

下面三种情况除外:

1,两个表格字段的对比;

2,日期类型字段与表达式对比;

3,使用表达式对日期类型字段进行对比;

原因:对于以上三种情况,mysql会将日期转换为字符串进行比较。

下面的例子,都是可以正常运行的:

INSERT INTO t1 (testdate) VALUES (20180912);
INSERT INTO t1 (testdate) VALUES ('20180912');
INSERT INTO t1 (testdate) VALUES ('18-09-12');
INSERT INTO t1 (testdate) VALUES ('2018.09.12');
INSERT INTO t1 (testdate) VALUES ('2018 09 12');
INSERT INTO t1 (testdate) VALUES ('0000-00-00');

SELECT testdate FROM t1 WHERE testdate >= '2018-09-12';
SELECT testdate FROM t1 WHERE testdate >= 20180912;
SELECT MOD(testdate,100) FROM t1 WHERE testdate >= 20180912;
SELECT testdate FROM t1 WHERE testdate >= '20180912';

Mysql允许存储"0000-00-00"作为DATE类型的“0”值,也称之为虚拟日期。在某些场景下比储存NULL值更便捷。如果将一个不合法的日期值保存到DATE类型字段中,mysql默认存储为"0000-00-00"。 如果不允许存储"0"值,请启用NO_ZERO_DATE参数。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值