1

我有一个有趣的给你。我有一个包含日期列 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 号是当前日期。
  • 最后一行被打折,因为没有一个日期在当前日期的一个月内。
  • 必须将日期计算在内,因为free_from日期包括在内,日期不包括在内free_until

我假设DATEDIFF()将在某个地方使用,但我不能,为了我的生活,解决这个问题。

谢谢你的时间!

编辑:这将进入 PHP mysql_query,因此可能会限制您对 MYSQL 可以做什么。

4

3 回答 3

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();

于 2013-01-30T10:53:14.653 回答
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)

大意是这样的,但这似乎非常笨拙和令人费解......

于 2013-01-30T10:53:00.613 回答
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)
于 2013-01-30T12:41:53.833 回答