gpt4 book ai didi

mysql - SQL查询打破月末的预订日期?

转载 作者:行者123 更新时间:2023-11-29 05:35:09 25 4
gpt4 key购买 nike

我正在使用自定义 PHP 函数为单月 生成可视化日历,该日历根据包含开始日期和持续时间的表格来划分日期 - 例如:

Calendar Example

...这是根据数据说该表应该从 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

(您可以安全地忽略组连接并将数据作为单独的行返回,这并不重要)。

我正在寻找对查询的修改,如果事件在上个月开始,则将在月初阻止日期,但它的长度将其包含在以下内容中。

例如 - 在上面的示例中,27 日的事件实际上计划在数据库中持续 7 天,所以如果我运行查询 MONTH(start_date) = '08' 我我想说前两个日期被屏蔽了,但目前不会,因为屏蔽它的开始日期不在所选月份中。

我相当确定其中有一个子查询或其他东西可以获取行,但我就是想不出来。有没有人要?

编辑

下面 Salman 的回答指出了我想去的方向,我想出了这个方法来获取上个月的结转,以显示为该月的“第一天”和剩余天数:

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 中有很多变量需要替换,所以也许有更好的方法?

最佳答案

原始答案:

假设所讨论的月份是 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 ...

关于mysql - SQL查询打破月末的预订日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11386416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com