Sql server SQL中两个日期之间的周末和日期

Sql server SQL中两个日期之间的周末和日期,sql-server,tsql,Sql Server,Tsql,我想得到两个日期范围内的所有日期。 像这样 Day Dt Tuesday 2020-12-01 Friday 2020-12-04 Tuesday 2020-12-08 Friday 2020-12-11 Tuesday 2020-12-15 Friday 2020-12-18 Tuesday 2020-12-22 Friday 2020-12-25 Tuesday 2020-12-29 我正在使用以下函数 ALTER FUNCTION [dbo].[fun_GetDatesf

我想得到两个日期范围内的所有日期。 像这样

Day     Dt
Tuesday 2020-12-01
Friday  2020-12-04
Tuesday 2020-12-08
Friday  2020-12-11
Tuesday 2020-12-15
Friday  2020-12-18
Tuesday 2020-12-22
Friday  2020-12-25
Tuesday 2020-12-29
我正在使用以下函数

ALTER FUNCTION [dbo].[fun_GetDatesforAday] (
    -- Add the parameters for the function here
    @fromD DATETIME
    ,@toD DATETIME
    
    ,@DayName VARCHAR(1000)
    )
RETURNS @table TABLE (
    --Id INT IDENTITY(1,1)
    [Day] VARCHAR(20)
    ,Dt DATE
    )
AS
BEGIN
    DECLARE @ServiceDays VARCHAR(1000)
    SET @ServiceDays = ''''+ REPLACE(@DayName,',',''',''')+''''

    
    while @fromD < = @toD
Begin
if datename (weekday, @fromD) in (@ServiceDays)
INSERT INTO @table
    VALUES (DATENAME(weekday, @fromD), @fromD)
 
SET @fromD = DATEADD(D, 1, @fromD)
END

    RETURN
END

SELECT  * FROM dbo.fun_GetDatesforAday('2020-12-01','2020-12-29','Tuesday,Friday')
现在我无法在函数中硬编码,我必须通过函数调用传递days参数。 如果我的代码有任何错误,请帮助我。
提前感谢

您需要拆分上一个参数的字符串

如果您这样更改函数:

ALTER FUNCTION [dbo].[fun_GetDatesforAday] (
    -- Add the parameters for the function here
    @fromD DATETIME
    ,@toD DATETIME
    
    ,@DayName VARCHAR(1000)
    )
RETURNS @table TABLE (
    --Id INT IDENTITY(1,1)
    [Day] VARCHAR(20)
    ,Dt DATE
    )
AS
BEGIN

    --DECLARE @ServiceDays VARCHAR(1000)
    --SET @ServiceDays = ''''+ REPLACE(@DayName,',',''',''')+''''
        
    
    while @fromD < = @toD
Begin
if datename (weekday, @fromD) in (SELECT Value FROM string_split(@DayName,','))
INSERT INTO @table
    VALUES (DATENAME(weekday, @fromD), @fromD)
 
SET @fromD = DATEADD(D, 1, @fromD)
END

    RETURN
END
那就行了

使用从dbo.fun_GetDatesforAday'2020-12-01'、'2020-12-29'、'星期二、星期五'中选择*

您将获得预期的结果:


您需要拆分最后一个参数的字符串

如果您这样更改函数:

ALTER FUNCTION [dbo].[fun_GetDatesforAday] (
    -- Add the parameters for the function here
    @fromD DATETIME
    ,@toD DATETIME
    
    ,@DayName VARCHAR(1000)
    )
RETURNS @table TABLE (
    --Id INT IDENTITY(1,1)
    [Day] VARCHAR(20)
    ,Dt DATE
    )
AS
BEGIN

    --DECLARE @ServiceDays VARCHAR(1000)
    --SET @ServiceDays = ''''+ REPLACE(@DayName,',',''',''')+''''
        
    
    while @fromD < = @toD
Begin
if datename (weekday, @fromD) in (SELECT Value FROM string_split(@DayName,','))
INSERT INTO @table
    VALUES (DATENAME(weekday, @fromD), @fromD)
 
SET @fromD = DATEADD(D, 1, @fromD)
END

    RETURN
END
那就行了

使用从dbo.fun_GetDatesforAday'2020-12-01'、'2020-12-29'、'星期二、星期五'中选择*

您将获得预期的结果:


我发现了你的错误。在这方面:

如果datename为weekday,@fromD为@ServiceDays

此变量@ServiceDays不是列表,您不能将其用作列表。“输入”操作符不工作。 我建议您使用此代码 但请注意,表值函数STRING_SPLIT在SQL Server 2016和最新版本中有效。如果您的版本较旧,请告诉我为您提供一个在SQL Server中拆分字符串的函数

alter FUNCTION [dbo].[fun_GetDatesforAday] (
    -- Add the parameters for the function here
    @fromD DATETIME
    ,@toD DATETIME
    
    ,@DayName VARCHAR(1000)
    )
RETURNS @table TABLE (
    --Id INT IDENTITY(1,1)
    [Day] VARCHAR(20)
    ,Dt DATE
    )
AS
BEGIN

while @fromD < = @toD
Begin
if  datename (weekday, @fromD) in (select value from STRING_SPLIT(@DayName, ','))
INSERT INTO @table
    VALUES (DATENAME(weekday, @fromD), @fromD)
 
SET @fromD = DATEADD(D, 1, @fromD)
END

    RETURN
END
go
SELECT  * FROM dbo.fun_GetDatesforAday('2020-12-01','2020-12-29','Tuesday,Friday')

我发现了你的错误。在这方面:

如果datename为weekday,@fromD为@ServiceDays

此变量@ServiceDays不是列表,您不能将其用作列表。“输入”操作符不工作。 我建议您使用此代码 但请注意,表值函数STRING_SPLIT在SQL Server 2016和最新版本中有效。如果您的版本较旧,请告诉我为您提供一个在SQL Server中拆分字符串的函数

alter FUNCTION [dbo].[fun_GetDatesforAday] (
    -- Add the parameters for the function here
    @fromD DATETIME
    ,@toD DATETIME
    
    ,@DayName VARCHAR(1000)
    )
RETURNS @table TABLE (
    --Id INT IDENTITY(1,1)
    [Day] VARCHAR(20)
    ,Dt DATE
    )
AS
BEGIN

while @fromD < = @toD
Begin
if  datename (weekday, @fromD) in (select value from STRING_SPLIT(@DayName, ','))
INSERT INTO @table
    VALUES (DATENAME(weekday, @fromD), @fromD)
 
SET @fromD = DATEADD(D, 1, @fromD)
END

    RETURN
END
go
SELECT  * FROM dbo.fun_GetDatesforAday('2020-12-01','2020-12-29','Tuesday,Friday')

您使用的是哪种数据库管理系统?说到日期/时间,许多产品远远不符合ANSI SQL。您使用的是哪一版本的SQL Server?你试过使用字符串分割函数吗?如果datename weekday,@fromD在“从字符串中选择值”_SPLIT@DayName,,,,“谢谢它的工作原理您使用的是哪种数据库管理系统?”?说到日期/时间,许多产品远远不符合ANSI SQL。您使用的是哪一版本的SQL Server?你试过使用字符串分割函数吗?如果datename weekday,@fromD在“从字符串中选择值”_SPLIT@DayName,,,,,“谢谢你,它起作用了