如何在两个日期之间使用COUNT返回1或0?
CREATE PROCEDURE [dbo].[CheckCharterDate]
@DateCheck date,
@DateCheck2 date,
@charterID int
AS
SELECT Count(StartDate)
FROM Booking
WHERE StartDate >= @DateCheck
AND EndDate <= @DateCheck2
AND CharterID = @charterID
RETURN 0
只要用户准确选择数据库中的两个日期,但是如果他们选择介于两者之间的日期,则此存储过程仅返回1或0,它返回0并表示它可用。
答案 0 :(得分:2)
如果需要用户定义的输出
,请使用Case...when
CREATE PROCEDURE [dbo].[CheckCharterDate]
@DateCheck date,
@DateCheck2 date,
@charterID int
AS
BEGIN
SELECT CASE WHEN Count(StartDate)=0 THEN 0
ELSE 1 END AS Count_StartDate
FROM Booking
WHERE StartDate <= @DateCheck2
AND EndDate >= @DateCheck
AND CharterID = @charterID
END;
为什么我改变了不平等的顺序?
由于重叠日期范围的基本条件是什么:
如果您必须检查start_date
,并且end_date
在@DateCheck
和@DateCheck2
( @DateCheck < @DateCheck2)
之间重叠,那么
检查
start_date
是否小于@DateCheck2
而end_date
是否大于@DateCheck
。
这就是为什么不平等会发生变化的原因。
答案 1 :(得分:0)
我认为您正在寻找重叠的日期范围 测试两个范围重叠的方法是确保一个在第二个结束之前开始,而第二个在第一个结束之前开始。您可以在overlap代码info中看到此内容的可视化效果。
CREATE PROCEDURE [dbo].[CheckCharterDate]
@DateCheck date,
@DateCheck2 date,
@charterID int
AS
SELECT Count(StartDate)
FROM Booking
WHERE StartDate <= @DateCheck2
AND EndDate >= @DateCheck
AND CharterID = @charterID
另外,正如Gordon Linoff在回答中指出的那样,你应该使用exists
代替count
。
答案 2 :(得分:0)
请勿使用COUNT()
。从绩效的角度来看,它不是最理想的。
相反,请使用EXISTS
:
CREATE PROCEDURE [dbo].[CheckCharterDate] (
@DateCheck date,
@DateCheck2 date,
@charterID int
) AS
BEGIN
SELECT (CASE WHEN EXISTS (SELECT 1
FROM Booking b
WHERE b.StartDate <= @DateCheck2 AND
b.EndDate >= @DateCheck2 AND
b.CharterID = @charterID
THEN 1 ELSE 0
END) as overlap_flag
END;
我不建议您从存储过程返回值 - 除非该值是状态。相反,只需编写用户定义的函数:
CREATE FUNCTION dbo.udf_CheckCharterDate (
@DateCheck date,
@DateCheck2 date,
@charterID int
) RETURNS INT
BEGIN
DECLARE @flag int;
SELECT @flat = (CASE WHEN EXISTS (SELECT 1
FROM Booking b
WHERE b.StartDate <= @DateCheck2 AND
b.EndDate >= @DateCheck2 AND
b.CharterID = @charterID
THEN 1 ELSE 0
END) as overlap_flag;
RETURN @flag;
END;
该功能可以简单地用作任何其他功能。例如:
WHERE dbo.udf_CheckCharterDate( . . . ) = 1
答案 3 :(得分:0)
CREATE PROCEDURE [dbo].[CheckCharterDate]
@DateCheck date,
@DateCheck2 date,
@charterID int
AS
declare @count int
set @count = SELECT Count(StartDate)
FROM Booking
WHERE StartDate <= @DateCheck2
AND EndDate >= @DateCheck
AND CharterID = @charterID
if (@count > 0)
begin
select 1
end
else
begin
select 0
end