1

我正在使用自定义 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 中替换,所以也许有更好的方法?

4

2 回答 2

3

原答案

假设有问题的月份是2012-07,您需要以下查询:

  SELECT column1, column2, columnN
   FROM `events`
  WHERE `start_date` <= '2012-07-01' 
    AND `start_date` + INTERVAL `duration` DAY > '2012-07-01'
ORDER BY start_date

修改后的答案

显然,您需要一个检查重叠(或冲突)日期的查询。示例日期已过2012-07-012012-08-01查询为:

  SELECT *
    FROM events
   WHERE '2012-08-01' > start_date
     AND start_date + INTERVAL duration DAY > '2012-07-01'
ORDER BY start_date

要限制开始日期和时间间隔,您可以使用SELECT ... CASE语句:

SELECT
CASE 
    WHEN start_date < '2012-07-01' THEN '2012-07-01' 
    ELSE start_date
END AS start_date_copy,
CASE 
    WHEN start_date < '2012-07-01' THEN duration - DATEDIFF('2012-07-01', start_date)
    ELSE duration 
END AS duration_copy,
FROM ...
于 2012-07-08T20:31:39.140 回答
0

我正在寻找的答案,感谢其他贡献者为我指出正确的方向并使我能够解决它!

这是基于来自 PHP 的 $yyyy 和 $mm (在我的情况下,进入函数调用),并选择单个行而不是分组:

SELECT start_date, duration
FROM reservations
WHERE YEAR(start_date) = '".$yyyy."'
AND  MONTH(start_date) = '".$mm."'

UNION

SELECT '".$yyyy."-".$mm."-01',
duration - DATEDIFF('".$yyyy."-".$mm."-01',start_date)
FROM reservations
WHERE YEAR(start_date) = '".$yyyy."'
AND MONTH(start_date) < '".$mm."'
AND MONTH(start_date + INTERVAL duration DAY) = '".$mm."'

ORDER BY start_date
于 2012-07-08T21:19:33.113 回答