我有一个房产租赁网站

所以我想知道这套房子是否在一段时间内可用

首先,我将日期范围定义为:

DECLARE @AvailableRentalStartingDate DATETIME = '2022-04-11'
, @AvailableRentalEndingDate DATETIME = '2022-04-24'

现在房产租金如下:

 DECLARE @Rentals AS TABLE
                                (
                                    [PropertyId]   UNIQUEIDENTIFIER,
                                    [StartingDate] DATE,
                                    [EndingDate]   DATE
                                )
            INSERT INTO @Rentals ([PropertyId], [StartingDate], [EndingDate]) 
    VALUES ('A5B2B505-EC6F-EC11-A004-00155E014807','2022-04-11 16:47:20.897', '2022-04-14 16:47:20.897'), 
           ('A5B2B505-EC6F-EC11-A004-00155E014807','2022-04-16 16:47:20.897','2022-04-21 16:47:20.897')

如你所见,我们有2022-04-15天的空房

日期表

        DECLARE @Dates AS TABLE
                          (
                              DateName DATE
                          )
        DECLARE @TotalDays INT = 365;

        WHILE @TotalDays > 0
            BEGIN
                INSERT INTO @Dates ([DateName])
                SELECT DATEADD(DAY, @TotalDays, '2021-12-31');
                SELECT @TotalDays = @TotalDays - 1;
            END

然后 Select

   SELECT [R].[PropertyId], [D].[DateName], CASE WHEN [R].[StartingDate] IS  NULL THEN 1 ELSE 0 END AS [IsAvailable]
    FROM @Dates AS D
             LEFT JOIN @Rentals R ON  [D].[DateName] >= [R].[StartingDate] AND [D].[DateName] <= [R].[EndingDate]
    WHERE [D].[DateName] BETWEEN @AvailableRentalStartingDate AND @AvailableRentalEndingDate
    AND [R].[PropertyId] = 'A5B2B505-EC6F-EC11-A004-00155E014807'
    ORDER BY [D].[DateName]

问题是它没有在可用日期2022-04-15上标识空值,它只是返回不可用的日期.

我只是想知道这propertyId个是否可用,在这种情况下,它应该是可用的,因为2022-04-15是可用的.我怎样才能只显示一行可用的true?当做

推荐答案

你的问题是propertyid的where子句;

demo link

  SELECT [R].[PropertyId], [D].[DateName], CASE WHEN [R].[StartingDate] IS  NULL THEN 1 ELSE 0 END AS [IsAvailable]
    FROM @Dates AS D
             LEFT JOIN @Rentals R ON  [D].[DateName] >= [R].[StartingDate] AND [D].[DateName] <= [R].[EndingDate]
AND [R].[PropertyId] = 'A5B2B505-EC6F-EC11-A004-00155E014807'
    WHERE [D].[DateName] BETWEEN @AvailableRentalStartingDate AND @AvailableRentalEndingDate
    
    ORDER BY [D].[DateName]

Sql相关问答推荐

如何用3个(半)固定位置建模团队,并有效地搜索相同/不同的团队?

SQL查询组类值在同一行中,并连接和排序其他值

在postgres中动态计算出现次数并插入到json中

在Golang中管理数据库事务的简洁方法

如何使用ROW_NUM() Select 一个没有第二条记录的实例?

如何在presto/SQL中使用两个数组列创建(分解)单独的行

将重复的值更新为下一个空闲数字

如何从JSON数组中 Select 多个值

正在try 从SQL获取最新的ID和一个唯一名称

在xml.Modify方法中使用子字符串和可能的替代方法

以一致的价值获得独特的价值

如何在T-SQL中编写row_number的WHERE子句?

在Postgres,什么是;.USSTZ;在';YYYY-MM-DD;T;HH24:MI:SS.USSTZ';?

SQL中相同表内的VLOOKUP等价

如何在 JSONB 数组的每个对象中添加新的键值对- PostgreSQL

PostgreSQL中如何提取以特定字符开头的字符串中的所有单词?

在 SQL 查询中创建滚动日期

Django only() 和 values() 不适用于 prefetch_related()

查找距上一条记录大于或等于 30 天的记录

在 Postgresql 中使用正确的 json 更新 json 字符串列