从 FromDate 和 ToDate 列表中构造动态 where 'Between'子句



从具有硬编码的单个"Between"的存储过程开始,如下所示

Select *
From Booking        
Where 
FromDate Between CONVERT(datetime, '1/5/2019') And CONVERT(datetime, '1/7/2020')

我想将startDate/EndDate对的集合传递给存储过程,其中每对生成一个新的Between,

类似于:

Where 
FromDate Between @startDate1 And @endDate1
Or FromDate Between @startDate2 And @endDate2
Or FromDate Between @startDate3 And @endDate3

我想知道是否要传入一个双分隔字符串(我知道这很可怕(,然后使用string_split首先生成该对,然后再次使用string_split将该对拆分为两个日期。这感觉真的不对。

我想我必须向存储过程传递一个(或两个(字符串,然后以某种方式将值放入临时表中,然后使用该表为每个表行添加一个"Between"。

请给我指正确的方向

Brad正确地使用了一个表变量,但没有使用循环。只需要JOIN。不过你必须先创建一个TYPE。这样的东西应该有效(它未经测试,因为我们没有样本数据(:
CREATE TYPE dbo.DateRange AS table (Startdate date, EndDate date);
GO
CREATE PROC dbo.YourProc @DateRanges dbo.DateRange READONLY AS
BEGIN
SELECT B.* --Replace this with the actual columns
FROM dbo.Bookings B
JOIN @DateRanges DR ON B.FromDate BETWEEN DR.Startdate AND DR.EndDate;
END;
GO
DECLARE @DateRanges dbo.DateRange;
INSERT INTO @DateRanges
VALUES('20200101','20200103'),
('20200107','20200107');
EXEC dbo.YourProc @DateRanges;
GO

最新更新