我有一个像这样的mysql表:
| ID | date_start | date_end |
| 1 | 2013-10-17 | 2013-10-18 |
| 2 | 2013-10-28 | 2013-10-31 |
我需要检查两个日期之间的空白时段。
要检索日期范围内的记录,我会这样做:
SELECT * FROM `periods` WHERE ((date_start <= '2013-10-18' AND date_end >= '2013-10-18' AND date_end <= '2013-10-31') OR (date_start >= '2013-10-18' AND date_start <= '2013-10-31' AND date_end >= '2013-10-31') OR (date_start >= '2013-10-18' AND date_end <= '2013-10-31') OR (date_start <= '2013-10-18' AND date_end >= '2013-10-31'))
在php中我可以通过while循环检查出来,但是有没有可以检查的mysql查询?
$first = true;
$emptyPeriod = false;
while ($period = mysql_fetch_assoc($result)) {
if($first) {
$first = false;
$prevEndPeriod = $period['date_end'];
continue;
}
$nextDay = date('Y-m-d', strtotime($prevEndPeriod . ' + 1 day'));
if($nextDay != $period['date_start']) {
$emptyPeriod = true;
break;
} else {
$prevEndPeriod = $period['date_end'];
}
}
echo ($emptyPeriod) ? 'Empty period' : 'OK';
答案 0 :(得分:0)
使用Mysql的DATEDIFF
功能:
SELECT DATEDIFF('2013-10-17','2013-10-18');
有关详细信息,请查看此链接:
http://answers.oreilly.com/topic/163-how-to-calculate-the-interval-between-two-dates-or-times-in-mysql/
OR
使用php:
floor(( strtotime( $endDate ) - strtotime( $startDate ) ) / 86400);
答案 1 :(得分:0)
以下查询将为您提供重叠期间的开始日期。如果有多个,则介于两者之间。
select distinct s.date_start
from periods s
left join periods e
on date_diff(s.date_start, e.date_end) <= 0
and date_diff(s.date_start, e.date_end) >= -1
where e.id is null
您的PHP代码将是:
echo (mysql_num_rows($result)>1) ? 'Empty period' : 'OK';
如果您需要空白期间的开始日期和结束日期,您可以以类似的方式获得重叠期间的结束日期,并更进一步。