4

我需要检查 MySQL 以查看两个日期间隔是否相交。为了更好地解释我的问题:我有一个事件管理模块。如果我们有一个像这样添加的事件:

开始日期 :'2013-09-09 08:00:00'

结束日期 :'2013-09-09 10:00:00'

现在我想添加另一个像这样的事件:

案例一:

开始日期 :'2013-09-09 09:00:00'

结束日期 :'2013-09-09 11:00:00'

或者像这样:

案例B:

开始日期 :'2013-09-09 07:00:00'

结束日期 :'2013-09-09 12:00:00'

我不应该这样做,因为在那个时间间隔内已经添加了一个事件 (08-10)

对于第一个示例(case A),我通过这样做解决了这个问题:

SELECT * FROM `events` as e 
    where 
    '2013-09-09 08:00:00' between e.ev_date_start and e.ev_date_end -- date start
    OR
    '2013-09-09 11:00:00' between e.ev_date_start and e.ev_date_end -- date end

但是对于第二种情况(case B),我无法弄清楚...

4

5 回答 5

6

这个想法是检查它们是否不相交,然后取反。

NOT ('2013-09-09 08:00:00' >= e.ev_date_end OR e.ev_date_start >= '2013-09-09 11:00:00')

这在逻辑上等价于

'2013-09-09 08:00:00' < e.ev_date_end AND e.ev_date_start < '2013-09-09 11:00:00'
于 2013-09-08T11:53:37.517 回答
5

要涵盖它们,您需要在 WHERE 子句中使用 4 条语句:

select *
  from `events` as e 
 where '2013-09-09 07:00:00' between e.ev_date_start and e.ev_date_end
    or '2013-09-09 12:00:00' between e.ev_date_start and e.ev_date_end
    or e.ev_date_start between '2013-09-09 07:00:00' and '2013-09-09 12:00:00'
    or e.ev_date_end between '2013-09-09 07:00:00' and '2013-09-09 12:00:00'

它可能看起来更简单,如下所示:

select *
  from `events` as e 
 where @start between e.ev_date_start and e.ev_date_end
    or @end between e.ev_date_start and e.ev_date_end
    or e.ev_date_start between @start and @end
    or e.ev_date_end between @start and @end
于 2013-09-08T11:50:36.827 回答
5

只测试已经分配的时间块或要分配的时间块的开始时间不会在彼此之间。

select * from `events` as e 
where '2013-09-09 08:00:00' between e.ev_date_start and e.ev_date_end
or e.ev_date_start between '2013-09-09 08:00:00'and '2013-09-09 11:00:00'
于 2013-09-08T11:56:44.013 回答
1

请记住,您预先保证(通过一些 UI 验证)2013-09-09 12:00:00大于2013-09-09 07:00:00您可以通过这种方式简单地交叉检查:

WHERE 1
AND '2013-09-09 07:00:00' <= e.ev_date_end 
AND '2013-09-09 12:00:00' >= e.ev_date_start

这种检查更加简单快捷。无需搞乱 OR 语句或其他复杂的逻辑。始终牢记 OR 会严重损害 SQL 的性能。

于 2017-05-21T18:15:53.813 回答
0

一个小例子:

我想看看这两个mysql日期是否与数据库上的日期相交;

'2015-02-01 00:00:00', '2015-02-28 23:59:59'

在 phpMyAdmin 或 MySQL Workbench 上执行的查询;

CREATE TEMPORARY TABLE `date_temp`
(
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `date_1` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Start date',
  `date_2` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Expiration date',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

INSERT INTO `date_temp` (`date_1`, `date_2`)
VALUES 
('2015-01-01 00:00:00', '2015-01-30 23:59:59'),
('2015-02-02 00:00:00', '2015-02-27 23:59:59'),
('2015-03-02 00:00:00', '2015-03-31 23:59:59'),
('2015-01-15 00:00:00', '2015-03-15 23:59:59'),
('2015-01-15 00:00:00', '2015-02-15 23:59:59'),
('2015-02-15 00:00:00', '2015-03-15 23:59:59');

SELECT * 
FROM `date_temp`
WHERE 
NOT 
(
    ('2015-02-01 00:00:00' > `date_2`) OR 
    (`date_1` > '2015-02-28 23:59:59') OR 
    (`date_2` < `date_1`) OR 
    ('2015-02-28 23:59:59' < '2015-02-01 00:00:00')
);

DROP TABLE `date_temp`;

该查询创建一个表,插入一些数据并测试两个日期是否与表上存在的日期相交。然后收拾桌子。

于 2015-02-25T09:15:36.263 回答