能否请你帮忙。我需要显示可用日期,范围是从表中获取的日期范围
我有一个预订表。它包含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
谢谢你的朋友。请帮我。
您可以使用UNION
从两列中获取结果。我只写一列查询。同样的方法适用于另一列。方法1将CAST()
方法与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);
在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