Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 获取SQL中两个日期之间的周末数_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 获取SQL中两个日期之间的周末数

Sql server 获取SQL中两个日期之间的周末数,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我需要得到sql中日期之间的周末数作为一个函数。我已经试过了,但在逻辑上还是站不住脚 CREATE FUNCTION fnc_NumberOfWeekEnds(@dFrom DATETIME, @dTo DATETIME) RETURNS INT AS BEGIN Declare @weekends int Set @weekends = 0 While @dFrom <= @dTo Begin If ((datepart(dw, @dFrom

我需要得到sql中日期之间的周末数作为一个函数。我已经试过了,但在逻辑上还是站不住脚

CREATE FUNCTION fnc_NumberOfWeekEnds(@dFrom DATETIME, @dTo   DATETIME)

RETURNS INT AS

BEGIN

   Declare @weekends int

   Set @weekends = 0

   While @dFrom <= @dTo Begin

      If ((datepart(dw, @dFrom) = 1))    

                  Set @weekends = @weekends + 1

                  Set @dFrom = DateAdd(d, 1, @dFrom)

   End

   Return (@weekends)

END

我在几个边缘案例中尝试了这个逻辑,它似乎奏效了

SELECT DATEDIFF(d, @dFrom, @dTo)/7+1
    + CASE WHEN DATEPART(dw,@dFrom) IN (1,7) THEN -1 ELSE 0 END
    + CASE WHEN DATEPART(dw,@dTo) IN (1,7) THEN -1 ELSE 0 END

您可以根据希望如何处理开始或结束日期在周末的情况来更改案例语句。在我的情况下,如果开始或结束日期是周六或周日,我不包括周末。

尝试用以下内容替换if语句:

If ((datepart(dw, @dFrom) = 1) OR (datepart(dw, @dFrom) = 7))    

您还应该检查周末以获得结果。

这将为您提供两个日期之间的星期日数

SELECT DateDiff(ww, @dFrom, @dTo) as NumOfSundays

使用以下逻辑计算开始日期和结束日期之间的星期六或星期日数

CREATE FUNCTION dbo.WEEKEND_COUNT
(
@Start_Date datetime,
@End_Date datetime
)
RETURNS int   
AS   
BEGIN
    Declare @count int = 0;
    while @Start_Date<=@End_Date
        Begin
        IF DatePart(WEEKDAY,@Start_Date) =  1 or DatePart(WEEKDAY,@Start_Date) =  7
        SET @count=@count+1
        SET @Start_Date=DateAdd(d,1,@Start_Date)
        END

return @count 
END

您需要指定边界日期与周末重叠时发生的情况。指定星期六和星期日,或星期五和星期六,或星期天和星期日时会发生什么情况?这取决于设置的日期优先否此将不尝试此选择日期差异WW,'2015-03-15','2015-03-20',因为2015年3月15日星期日是星期日,这将导致零而不是一。
Select dbo.WEEKEND_COUNT('Your start date','your end date')
DECLARE @date_from DATETIME,
@date_to DATETIME


/*TEMPORARY TABLE*/
DECLARE @DATES AS TABLE (
GDate DATETIME
)
SELECT @date_from ='2019-09-10'
SELECT @date_to ='2019-10-10'

/*DATE GENERATED*/
WITH dates
AS (
SELECT @date_from AS dt

UNION ALL

SELECT DATEADD(D, 1, dt)
FROM dates
WHERE dt < @date_to
)

/*INSERTED DATES INTO TEMP TABLE */
INSERT INTO @DATES
SELECT CONVERT(DATETIME, dt) AS Gdate FROM dates

/*Get Records from temp table*/
SELECT Gdate FROM @DATES