我正在使用自定义 PHP 函数来生成一个月的可视日历,该日历根据包含开始日期和持续时间的表阻止日期 - 例如:
...这是由数据产生的,该表应从 14 日起封锁 4 天,从 27 日起封锁 7 天。
查询看起来像这样:
SELECT GROUP_CONCAT(DATE_FORMAT(start_date,'%d'),':', event_duration) AS info
FROM events
WHERE YEAR(start_date = '2012'
AND MONTH(start_date) = '07'
ORDER BY start_date
(您可以放心地忽略组 concat 并将数据作为单独的行返回,这并不重要)。
我正在寻找对查询的修改,如果事件在上个月开始,它将阻止月初的日期,但它的长度将其纳入以下。
例如 - 在上面的示例中,27 日的事件实际上计划在数据库中持续 7 天,所以如果我运行查询,MONTH(start_date) = '08'
我想说前两个日期被屏蔽,他们目前不会是,因为会阻止它的开始日期不在选择的月份。
我相当确定那里有一个子查询或其他东西来获取行,但我就是想不出来。有接盘侠吗?
编辑
下面萨尔曼的回答指出了我想去的方向,我想出了这个方法来获取上个月的结转,以显示为当月的“第一天”以及剩余天数:
SELECT IF(MONTH(start_date) < '08', '2012-08-01', start_date) AS starter,
IF(MONTH(start_date) < '08', duration - DATEDIFF('2012-08-01',start_date), duration) AS duration
FROM EVENTS
WHERE YEAR(start_date) = '2012'
AND (MONTH(start_date) = '08' OR MONTH(start_date + INTERVAL duration DAY) = '08')
显然有很多变量要在 PHP 中替换,所以也许有更好的方法?