我正在寻求有关搜索给定时间段内项目可用性的算法的帮助,此“我的表”:
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')