我正在寻求有关搜索给定时间段内项目可用性的算法的帮助,此“我的表”:

CREATE TABLE Emprunter
(
    idEmp int primary key identity,
    idClt int references Client,
    idMat int references Materiel,
    dateEmprunt date,
    dateRetour date, --this is a nullable
    dureeEmprunt int,
    montantTotal money
)

dateRetour列可以为空,当客户端返回该项时将插入该值,因此如果某项具有dateRetour值,则该项是可用的。
现在我想到的是:
Create function IsMatrielDisponible
     (@idMat int, @dateD date, @dateF date)
returns bit
as
Begin
    Declare @Bool bit = 1

    if(Exists(select *
              from Emprunter
              where idMat = 2 and dateRetour is null
                and ((dateEmprunt >= @dateD or dateEmprunt <= @dateD) and dateEmprunt <= @dateF)))
        set @Bool = 0

    return @Bool
End

select  dbo.IsMatrielDisponible(1,'2018-03-05','2018-06-05')

但它不起作用。我在表中有一个id = 1的记录,并且dateRetour为空,因此项查找应该返回不可用的返回0,但是函数返回1
更新-设计器中的表:
如您所见,该列为空。
因为我想要的行为是当我给函数一个matériel(idmat)和一个date depart(@dated)和一个date return(@datef)时,它应该在rent表(emprunter)中查找该项,如果该项可用,它应该返回1,如果不返回0,
简单数据:
例如,如果我查找的项3应该是可用的,因为没有人租用它,但是对于项1是由另一个客户端租用的,因为dateretour为空这意味着客户端尚未返回该项
select  dbo.IsMatrielDisponible(1,'2018-03-05','2018-06-05')

所以通过执行它应该返回0,我希望你能得到

最佳答案

我会考虑将其重写为内联表值函数,而不是标量函数它对性能更好,并且具有更多的灵活性。我还删除了很多额外的代码。转换为位时,除0以外的任何值都将为1。所以我们可以很容易地利用它。不能返回空值,如果有满足查询条件的行,则返回1我还删除了dateemprunt的内容,因为不需要它。不存在既不能=到给定日期的日期。也许这应该是一个简单的dateemprunt不为空,但我不知道你在尝试实现什么。

Create function IsMatrielDisponible(@idMat int, @dateD date, @dateF date)
returns table as return

    select IsDisponible = convert(bit, count(*))
    from Emprunter
    where idMat = @idMat
        and dateRetour is null
        --and ((dateEmprunt >= @dateD or dateEmprunt <= @dateD ) this is pointless as every value will return true from this
        and dateEmprunt <= @dateF

GO

select *
from dbo.IsMatrielDisponible(1,'2018-03-05','2018-06-05')

08-17 00:04