两个日期之间的差异返回1或0

时间:2018-03-20 10:39:14

标签: sql-server tsql stored-procedures

如何在两个日期之间使用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并表示它可用。

4 个答案:

答案 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是否小于@DateCheck2end_date是否大于@DateCheck。 这就是为什么不平等会发生变化的原因。

答案 1 :(得分:0)

我认为您正在寻找重叠的日期范围 测试两个范围重叠的方法是确保一个在第二个结束之前开始,而第二个在第一个结束之前开始。您可以在代码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