select a from t1 where DATEDIFF(a, '2018-09-11') < 0;
该语句是为了查出2018-09-11 日期之前的一切纪录,但这个语句有个题目,假如a字段加了索引,用这类范例举行日期对照,会致使查询不走索引,从而使查询机能下落。
引荐课程:MySQL教程。
看了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参数。
也可运用unix_timestamp函数,将字符型的时候,转成unix时候戳。
select meeting_id,meeting_name,start_time,end_time from meeting_data where meeting_id REGEXP '[0-9]{4}0001' and unix_timestamp(start_time) < unix_timestamp(NOW()) and unix_timestamp(end_time) > unix_timestamp(NOW());
以上就是mysql能够比较时候吗的细致内容,更多请关注ki4网别的相干文章!