【问题标题】:Mysql/Doctrine - Check if month is between 2 datesMysql/Doctrine - 检查月份是否在两个日期之间
【发布时间】:2021-10-17 21:31:09
【问题描述】:

我有一张表,比如说 road_trip,其中包含 startDateendDate 列。

我想做一个查询,可以搜索一个月或多个月(将是一个数组)是否位于 startDate 和 endDate 之间。

例如,如果 startDate = "2020-05-21" 和 endDate = "2025-05-22" 对于给定的月份 = 5(对应于五月),我们应该有一些结果。

但是对于这个例子:startDate = "2020-06-21" and endDate = "2020-07-22" 对于给定的月份 = 5(对应于五月),我们不应该有任何结果,因为月份不在日期之间。

我不知道如何编写高效的查询。

我从本机函数 MONTH 开始,但它不能正常工作,因为我需要检查年份,例如 startDate 的年份是 2020 年,而 endDate 的年份是 2025 年。月份将自动在它们之间但如果年份相同,则可能不在日期之间。

谢谢大家

【问题讨论】:

  • 用 AND 制作月份(你的日期)和年份(你的日期)
  • 我无法确定我的日期,因为它不是一个日期,它只是一个月,可能是 5(5 月)或 11(11 月)。给定一个月,我想知道这个月是否介于存储在我的表中的 2 个日期之间
  • 从 year(curdate()) 中提取年份并将其添加到您的日期,即您的日期 + 当前年份

标签: mysql doctrine


【解决方案1】:

这在 MySQL 8 和 Mariadb 10.3 下有效,不会很快

CREATe TABLE road_trip (startDate Date,endDate  Date)
INSERT INTO road_trip  VALUES("2020-06-21", "2020-07-22" ),("2020-04-21", "2020-07-22" )
create fUNCTION findnemo( _startdate date ,_enddate date, _amonth int)
RETURNS INT
DETERMINISTIC
BEGIN
WITH RECURSIVE t as (
    select  _startdate as dt
  UNION
    SELECT DATE_ADD(t.dt, INTERVAL 1 DAY) FROM t WHERE DATE_ADD(t.dt, INTERVAL 1 DAY) <= _enddate
)
select SUM(MONTH(dt) = _amonth) into @count FROM t;
RETURN @count > 0;
END
SELECT * FROM road_trip WHERE findnemo(startDate,endDate,5)  > 0
开始日期 |结束日期 :--------- | :--------- 2020-04-21 | 2020-07-22

db小提琴here

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2012-11-13
    相关资源
    最近更新 更多