gpt4 book ai didi

mysql - 如何在列表中显示当前月份的项目,其中当前月份的日期在新年的 A 和 B 之间

转载 作者:行者123 更新时间:2023-11-29 02:40:19 25 4
gpt4 key购买 nike

去年我建立了一个项目管理系统,但现在我们在新的一年里我被一些(我的)新手编码困扰了 :)

所以现在我真的需要你的帮助来了解如何一劳永逸地解决这个问题。

错误:

现在的主要问题是年轮转,现在我的 SQL 查询不明白新年 (1) 的月份大于当前年份 (12),因此不显示列表中的正确项目。

有什么想法吗?提前致谢!

这是我当前的 SQL 查询:

SELECT *
FROM projects
WHERE MONTH(CURDATE()) between MONTH(project_start) and MONTH(project_delivery)
AND YEAR(CURDATE()) between YEAR(project_start) and YEAR(project_delivery)
order by project_id

这是表项目的原始结构:

Project_id projet_start projet_delivery
1 2018-12-20 2018-12-22
2 2018-12-25 2018-12-29
3 2018-12-28 2018-12-28
4 2018-12-30 2019-01-22

最佳答案

BETWEEN 适用于实际日期:

SELECT *
FROM projects
WHERE CURDATE() between project_start and project_delivery
order by project_id

如果您想要月份(月粒度)而不是日粒度的所有内容:

SELECT *
FROM projects
WHERE CURDATE() between DATE_SUB(project_start, INTERVAL DAY(project_start)-1 DAY) and
DATE_ADD(DATE_SUB(project_delivery, INTERVAL DAY(project_delivery) DAY), INTERVAL 1 MONTH)
order by project_id

因此,如果一个项目于 12 月 5 日开始并于 1 月 19 日完成,这将提供 12 月 1 日至 1 月 31 日之间的所有内容。请记住,如果 1 月 31 日的任何日期也有时间部分(即晚于午夜),则意味着该日期略晚于此结束日期并且不会显示。

如果是这种情况,请发表评论并且您需要帮助解决它(最容易不使用 BETWEEN 因为它始终包含在两端,使用 < 是独占的)

更新:本月有一些事件的项目,即一个项目:

  • 开始于之前,结束于
  • 之前开始,之后结束
  • 开始于,结束于
  • 开始于,结束于

这些的共同点是项目的开始日期在本月底之前,项目的结束日期也在本月初之后

SELECT *
FROM projects
WHERE
--started before the end of this month
project_start < DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE()) - 1 DAY), INTERVAL 1 MONTH) AND
--ended after the start of this month
project_delivery > DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE()) DAY)

order by project_id

DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE()) DAY)是一种相当复杂的书写方式“从当前日期减去当前日期”,即 2019-01-02 minus 2 -> 2018-12-31 .我们寻找日期 >这个(以免包括在内)

同样,DATE_ADD(DATE_SUB(CURDATE(), INTERVAL DAY(CURDATE()) - 1 DAY), INTERVAL 1 MONTH)取当前日期,将第 DAY-1 天(所以这次只有 1,而不是 2)减去它以达到本月的 1 日,然后加上一个月以到达下个月的第一天。 2019-01-02 -> 2019-01-01 -> 2019-02-01 .再次<所以它是独一无二的

如果你是在 1 月 31 日,然后先添加一个月,则采用另一种方式(添加一个月然后减去一天)会有一个错误 - 没有 2 月 31 日,因此 mysql 将在 28 日达到上限2 月,然后不到 31 天,给出的日期不是 1 月末(即 1 月 28 日)

关于mysql - 如何在列表中显示当前月份的项目,其中当前月份的日期在新年的 A 和 B 之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54006550/

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