SELECT COUNT(DISTINCT ca_user_id) from order_info_ref where order_time>='2015-01-01' and order_time <='2015-01-04';
SELECT COUNT(DISTINCT ca_user_id) from order_info_ref where DATE_FORMAT(order_time,'%Y-%m-%d')>='2015-01-01'
and DATE_FORMAT(order_time,'%Y-%m-%d')<='2015-01-04' ;
数据库有两百多万条数据,通过第一种方式查询 返回的结果有三十多万条数据,通过第二种方式查询返回的接口有四十多万条数据,不知道是什么原因!
区别在于
order_time <='2015-01-04'; 所有时间超过2015-01-04是不符合查询区间
而
DATE_FORMAT(order_time,'%Y-%m-%d')<='2015-01-04' ;恰恰相反
刚好隔了2015-01-04这一天的数据
第一个查询存在日期隐式转字符串的问题,第二个查询则不存在.
第二个查询一定会把2015-01-04 00:00:00到2015-01-04 23:59:59的数据带出来.
而第一个就不一定了,如果隐式转换后的字符串是带时分秒的,前面相同就会比较长度,这样一来,2015-01-04 00:00:00到2015-01-04 23:59:59的数据其实就被过滤掉了,因为这部分字符串和2015-01-04比较,都大于后者