我需要一个MSSQL Server中的函数,作为参数将获得@startTime @endTime并检查表预留(也有startTime和endTime),如果询问的日期范围将适合表中的时间范围和返回1如果是和0如果不。有点混乱我会在桌面上更好地解释(至少我希望如此)
我有桌子:
|:-----------------------|----------------------:|
| startDate | endDate |
|:-----------------------|----------------------:|
| 2017-01-25 00:00:00.000|2017-01-25 12:00:00.000|
| 2017-01-25 13:00:00.000|2017-01-25 14:00:00.000|
|:-----------------------|----------------------:|
需要检查是否可以预订,即:
@startTime = 2017-01-25 13:30:00.000
@endTime = 2017-01-25 15:00:00.000
因为在这段时间内有预约所以应该返回0。
我试过@startTime> startDate和@endTime< endDate但条件是检查每一行,我需要检查整个表。
亲切的问候
答案 0 :(得分:2)
您可以这样做:
select (case when exists (select 1
from reservations r
where r.startDate <= @endTime and
r.endDate >= @startTime
)
then 0 else 1
end) as available;
逻辑很简单。如果第一个在第二个结束之前开始而第一个结束在第二个结束之后开始,则两个时间段重叠。
答案 1 :(得分:1)
create table info(startdate datetime, enddate datetime);
insert into info values
('2017-01-01', '2017-01-05'),
('2017-01-03', '2017-01-06'),
('2017-01-01', '2017-01-15'),
('2017-01-02', '2017-01-13'),
('2017-01-12', '2017-01-18');
declare @StartDate datetime = '2017-01-03';
declare @EndDate datetime = '2017-01-04'
select *
from info
where startdate <= @StartDate and enddate >= @EndDate;
+----+---------------------+---------------------+
| | startdate | enddate |
+----+---------------------+---------------------+
| 1 | 01.01.2017 00:00:00 | 05.01.2017 00:00:00 |
+----+---------------------+---------------------+
| 2 | 03.01.2017 00:00:00 | 06.01.2017 00:00:00 |
+----+---------------------+---------------------+
| 3 | 01.01.2017 00:00:00 | 15.01.2017 00:00:00 |
+----+---------------------+---------------------+
| 4 | 02.01.2017 00:00:00 | 13.01.2017 00:00:00 |
+----+---------------------+---------------------+