我需要Mysql查询来查找选定月份和年份的可用日期,但不包括从表中获取的日期

问题描述 投票:0回答:2

能否请你帮忙。我需要显示可用日期,范围是从表中获取的日期范围

我有一个预订表。它包含mStartdate和结束日期

读取表并显示所有可用日期,但不包括所选月份和年份从表中获取的日期。

预订表| ID |开始日期|结束日期|| 1 | 2020-03-05 | 2020-03-05 || 2 | 2020-03-10 | 2020-03-11 || 3 | 2020-03-12 | 2020-03-14 || 3 | 2020-03-16 | 2020-03-18 |

我需要的是03月份(即3月)的所有可用日期。例子

2020-03-01 t0 2020-03-04 is available
2020-03-06 t0 2020-03-09 is available
2020-03-15 t0 2020-03-15 is available
2020-03-19 t0 2020-03-31 is available

我想更清楚地表明我想要从预订表中读取3月的日期。然后创建可用日期列表,例如

2020-03-01
2020-03-02
2020-03-03
2020-03-04
2020-03-06
2020-03-07
2020-03-08
2020-03-09
2020-03-15
2020-03-19
to
2020-03-31

谢谢你的朋友。请帮我。

mysql sql date range
2个回答
0
投票

您可以使用UNION从两列中获取结果。我只写一列查询。同样的方法适用于另一列。方法1CAST()方法与MySql BETWEEN方法结合使用

SELECT *
FROM tableName
WHERE StartDate BETWEEN CAST('2014-02-01' AS DATE) AND CAST('2014-02-28' AS DATE);

方法2在不使用MySql CAST()方法的情况下使用BETWEEN方法

SELECT *
FROM tableName
WHERE StartDate >= CAST('2014-02-01' AS DATE)
AND StartDate <= CAST('2014-02-28' AS DATE);

0
投票

在MySQL 8.0中,您可以使用递归公用表表达式来生成月份的日期列表,然后使用表中定义的日期范围对其进行过滤:

with recursive cte as (
    select '2020-03-01' dt
    union all select dt + interval 1 day 
    from cte
    where dt + interval 1 day < '2020-04-01'
)
select dt
from cte c
where not exists (select 1 from mytable t where c.dt between t.start_date and t.end_date)
order by dt

在早期版本中,一种解决方案涉及一个数字表;这是带有派生表的解决方案

select '2020-03-01' + interval x.n day dt
from (select 0 n union all select 2 ... union all select 30) x
where not exists (
    select 1
    from mytable t
    where '2020-03-01' + interval x.n day between t.start_date and t.end_date
)
order by dt
© www.soinside.com 2019 - 2024. All rights reserved.