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,,,,,“谢谢你,它起作用了