我为你准备了一个有趣的。我有一个数据库,其日期列为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
free_from
日期是包含在内的
free_until
日期是独家的。我假设DATEDIFF()
将会在某个地方使用,但我不能在我的生活中使用它。
谢谢你的时间!
编辑:这将进入PHP mysql_query,因此可能会限制您对MYSQL的处理方式。
答案 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)