我处于我希望将日期范围与其他日期范围匹配的情况,它可能很简单,但我坚持下去。
下面是表格结构
表格 - 生命周期
然后有几条记录如下
1 - 07/23/2013 - 07/24/2013
2 - 07/15/2013 - 07/25/2015
3 - 03/10/2013 - 03/10/2014
现在我想按日期范围搜索这些记录,并希望查看该范围内是否存在某些生命;例如我想找到08/01/2013 - 01/01/2014之间的生活
根据预期的结果,它应该选择生命#2和生命#3
如何使用MySQL查询完成此操作?
非常感谢任何帮助。
答案 0 :(得分:2)
此查询应该这样做:
SELECT
*
FROM
lifecycles
WHERE
str_to_date(life_start_date, '%m/%d/%Y') <= '2014-01-01'
AND str_to_date(life_end_date, '%m/%d/%Y') >= '2013-08-01';
这基本上意味着在你想要的范围结束之前生命还没有开始,生命并没有在范围开始之前结束。
由于您以VARCHAR格式保留日期,因此您需要使用str_to_date函数,这是不好的,因为MySQL将无法利用您在start_date或end_date列上的任何可能的索引。
答案 1 :(得分:1)
这可能会对你有帮助。
SELECT SUM( IF( '2014-01-02' BETWEEN from_date AND to_date, 1, 0 ) ) AS from_exist,
SUM( IF( '2014-02-12' BETWEEN from_date AND to_date, 1, 0 ) ) AS to_exist
FROM date_range
因此,根据结果,您可以检查日期是否在现有日期范围之间。
答案 2 :(得分:0)
因此,您希望排除在08/01/2013之前结束的生命以及在01/01/2014之后未启动的生命。这应该有效:
SELECT *
FROM lifecycles as alive
WHERE NOT EXISTS (
SELECT 1
FROM lifecycles as dead
WHERE dead.life_id = alive.life_id
AND (str_to_date(life_start_date, '%m/%d/%Y') > '2014-01-01'
OR str_to_date(life_end_date, '%m/%d/%Y') < '2013-08-01'))