0

我处于想要将日期范围与另一个日期范围匹配的情况,这可能很简单,但我坚持下去。

下面是表结构

表 - 生命周期

  • life_id
  • life_start_date
  • 生命结束日期

然后一些记录如下

1 - 07/23/2013 - 07/24/2013
2 - 07/15/2013 - 07/25/2015
3 - 03/10/2013 - 03/10/2014

现在我想按日期范围搜索这些记录,并想看看该范围内是否存在一些生命;例如,我想找到 2013 年 8 月 1 日至 2014 年 1 月 1 日之间的生活

正如预期的结果,它应该选择 life#2 和 life#3

如何使用 MySQL 查询来做到这一点?

非常感谢任何帮助。

4

3 回答 3

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 列上拥有的任何可能的索引。

于 2013-08-23T12:35:31.570 回答
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

因此,根据结果,您可以检查日期是否在现有日期范围之间。

于 2014-02-13T14:31:13.930 回答
0

因此,您要排除 2013 年 8 月 1 日之前结束的生命和 2014 年 1 月 1 日之后未开始的生命。这应该有效:

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'))
于 2013-08-23T13:03:51.380 回答