在Mysql之间比较多个日期

时间:2014-09-28 14:41:13

标签: mysql

我有这个查询

SELECT * 
FROM   `reservations` 
WHERE  '2014-09-04' BETWEEN check_in AND check_out 

在另一种情况下,我需要将此check_in和check_out字段与多个日期进行比较。此查询可以解决该问题

SELECT * 
FROM   `reservations` 
WHERE  '2014-09-04' BETWEEN check_in AND check_out 
        OR '2014-09-09' BETWEEN check_in AND check_out 

但如果我有很多日期要比较,这个查询效率不高。有人有解决方案来缩短这个查询吗?

3 个答案:

答案 0 :(得分:2)

更短的查询:

SELECT DISTINCT r.* 
 FROM reservations r
 JOIN (
  SELECT '2014-09-04' AS dt UNION
  SELECT '2014-09-09' AS dt
 ) dates ON dates.dt BETWEEN r.check_in AND r.check_out

答案 1 :(得分:1)

如果您在check_incheck_out上没有索引,则or的多个条件是最佳方法。如果您确实在这些列上有索引并且在第一种情况下使用它们,那么请尝试使用union

SELECT * 
FROM `reservations` 
WHERE '2014-09-04' BETWEEN check_in AND check_out 
UNION
SELECT * 
FROM   `reservations` 
WHERE  '2014-09-09' BETWEEN check_in AND check_out ;

请注意union会产生删除重复项的开销。我正在使用它,因为你可能在结果中有重复,并且可能是你不想要它们。一般情况下,我建议尽可能使用union all

答案 2 :(得分:0)

如果您需要检查重叠:

SELECT *
FROM reservations
WHERE '2014-09-04' <= check_out AND '2014-09-09' >= check_in