MySQL通过在左侧应用date()函数来优化查询

时间:2016-07-02 06:53:46

标签: mysql

任何人都可以建议如何优化以下查询,而不在列datecol1上的条件中应用日期函数。我们已经在datecol1上有索引但由于左侧是date()函数而没有考虑它。

SELECT DISTINCT DATE(datecol2)
FROM table1
WHERE DATE(datecol1) BETWEEN DATE(DATE_SUB(NOW(), INTERVAL 7 HOUR)) AND
                             DATE(DATE_SUB(NOW(), INTERVAL 1 HOUR));

感谢您的帮助!

更新: 表格包含以下行:

 datecol2               datecol1    
'2016-06-17 01:10:07', '2016-07-02 01:41:44'    
'2016-06-20 17:18:49', '2016-07-02 01:01:16'     
'2016-06-21 18:22:16', '2016-07-02 00:57:30'    
'2016-06-23 16:09:21', '2016-07-02 00:01:51'     
'2016-06-23 16:13:24', '2016-07-02 00:01:51'     
'2016-06-23 16:14:07', '2016-07-01 23:01:51'     
'2016-06-24 16:14:07', '2016-07-01 07:01:51'    
'2016-06-25 16:14:07', '2016-07-01 08:11:51' 

因此,我们需要挑选所有最后3行,因为它与日期(colname)匹配,即2016-07-01以及2016-07-02 查询看起来像

 SELECT DISTINCT DATE(datecol2) FROM table1
 WHERE DATE(datecol1) BETWEEN DATE('2016-07-01 23:00:00') AND  DATE('2016-07-02 05:00:00');

1 个答案:

答案 0 :(得分:0)

如果datecol1具有DATETIME类型 - 在这种情况下无需应用DATE功能。 WHERE子句中的所有关键argumnents都是DATETIME值,因为DATE_SUB还返回DATETIME值:

SELECT distinct DATE(datecol2) 
FROM table1
WHERE datecol1 
      BETWEEN date_sub(now(), interval 7 hour) 
      AND date_sub(now(), interval 1 hour);

例如,以下查询将返回1

select 1 from CatalogAreas
where '2016-07-02 08:00:00' between date_sub(now(), interval 7 hour)  and date_sub(now(), interval 1 hour)
limit 1;