如何编写查询判断输入日期范围@FromDate/@ToDate不在数据库范围内
实现日期范围存在性判断的SQL查询
你需要编写SQL查询,判断输入的@FromDate和@ToDate组成的日期区间是否与数据库中已有的所有日期范围完全无交集,无交集时返回true,否则返回false。
核心SQL查询(以SQL Server为例)
SELECT CASE WHEN EXISTS ( SELECT 1 FROM DateRanges WHERE StartDate <= @ToDate AND EndDate >= @FromDate ) THEN CAST(0 AS BIT) -- 存在重叠,返回false ELSE CAST(1 AS BIT) -- 无重叠,返回true END AS IsRangeNotExists;
逻辑说明
- 区间重叠判断:使用标准的区间重叠条件
StartDate <= @ToDate AND EndDate >= @FromDate,只要数据库中存在任意一条记录满足该条件,就说明输入的日期范围与已有范围存在交集。 - 结果映射:
- 若存在重叠记录,
EXISTS返回true,通过CASE语句返回0(对应逻辑false)。 - 若没有任何重叠记录,
EXISTS返回false,返回1(对应逻辑true)。
- 若存在重叠记录,
适配不同数据库
- 如果使用MySQL,可直接用布尔值替换类型转换:
SELECT CASE WHEN EXISTS ( SELECT 1 FROM DateRanges WHERE StartDate <= @ToDate AND EndDate >= @FromDate ) THEN FALSE ELSE TRUE END AS IsRangeNotExists;
对应用户示例验证
- 输入
@FromDate='2024-01-18'、@ToDate='2024-01-21':无重叠记录,返回true。 - 输入
@FromDate='2024-01-18'、@ToDate='2024-01-24':与已有区间重叠,返回false。 - 输入
@FromDate='2024-01-06'、@ToDate='2024-01-08':与已有区间重叠,返回false。 - 输入
@FromDate='2024-01-09'、@ToDate='2024-01-09':无重叠记录,返回true。
内容的提问来源于stack exchange,提问作者Duy Khương
相关产品推荐
相关产品推荐

