计算给定时间段内的免费日期数量

时间:2013-01-30 10:26:29

标签: php mysql

我为你准备了一个有趣的。我有一个数据库,其日期列为free_from和free_until。我需要找到的是从现在到今天1个月之间的免费天数。例如,如果当前日期是2013/01/15并且列如下:

free_from | free_until
2013/01/12| 2013/01/17
2013/01/22| 2013/01/26
2013/01/29| 2013/02/04
2013/02/09| 2013/02/11
2013/02/14| 2013/02/17
2013/02/19| 2013/02/30

答案是16 为2 + 4 + 6 + 2 + 2 + 0 = 16

  • 第一行仅从第15行而不是第12行开始计算 因为15日是当前日期。
  • 最后一行是打折的,因为没有一个日期在a内 当前日期的月份。
  • 必须计算日期,因为free_from日期是包含在内的 free_until日期是独家的。

我假设DATEDIFF()将会在某个地方使用,但我不能在我的生活中使用它。

谢谢你的时间!

编辑:这将进入PHP mysql_query,因此可能会限制您对MYSQL的处理方式。

3 个答案:

答案 0 :(得分:2)

SET @today = "2013-01-15";
SET @nextm = DATE_ADD(@today, INTERVAL 1 month);
SET @lastd = DATE_ADD(@nextm, INTERVAL 1 day);

SELECT 
 DATEDIFF(
   IF(@lastd> free_until, free_until, @lastd), 
   IF(@today > free_from, @today, free_from)
 )
FROM `test` 
WHERE free_until >= @today AND free_from < @nextm

那应该有用。至少对你的测试数据。但是哪一天是2013/02/30? : - )

别忘了改变@today = CURDATE();

答案 1 :(得分:0)

我能想到的最好的是:

WHERE free_until > CURDATE()
AND free_from < CURDATE() + INTERVAL '1' MONTH

这将消除任何不必要的行。然后在PHP的第一行做:

date_diff(date(), free_until)

在最后一行,执行:

date_diff(free_from, strtotime(date("Y-m-d", strtotime($todayDate)) . "+1 month"))

然后在中间日期做:

date_diff(free_from, free_until)

这样的效果,但这看起来非常笨拙和令人费解......

答案 2 :(得分:0)

从头脑中......先做一个:

SELECT a.free_from AS a_from, a.free_until AS a_until, b.free_from AS b_from
FROM availability a
INNER JOIN availability b ON b.free_from > a.free_until
ORDER BY a_from, b_from

这可能会返回一组行,其中对于您接下来的每个行间隔,即更大的间隔。结果是战略性的。然后,您可以通过以下方式将结果包装在部分组中:

SELECT * FROM (
SELECT a.free_from AS a_from, a.free_until AS a_until, b.free_from AS b_from
FROM availability a
INNER JOIN availability b ON b.free_from > a.free_until
ORDER BY a_from, b_from
) AS NextInterval
GROUP BY a_from, b_until

在上面的查询中,添加一个DATE_DIFF子句(必要时将其包装在SUM()中):

DATE_DIFF(b_until, a_from)