sql-server - SQL中两个日期之间的周末日期和日期
问题描述
我想在两个日期范围内获得所有日期和日期。像这样
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')
注意:如果我使用这种条件,那么它的工作原理
if datename (weekday, @fromD) in ('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
然后它会工作。
使用SELECT * FROM dbo.fun_GetDatesforAday('2020-12-01','2020-12-29','Tuesday,Friday')
你会得到预期的结果:
推荐阅读
- tensorflow - 如何微调不稳定的 dcGAN
- docker - IBM 混合云上的容器死了,但在我调试之前就被删除了
- php - 如何列出公用文件夹中的文件?
- sql-server - 可空表达式上的 Azure Synapse 军事化视图错误
- sql - 仅当两个用户都是 sql server 的朋友时如何获取数据
- java - Java实现互相关二维图像
- python - 安装 ddsp python 模块时出现问题 9ModuleNotFoundError: No module named 'ddsp')
- javascript - 如何使用 WebView2 获取回调数据
- sql - 使用 Hive SQL 获取文件系统目录大小
- shopify - 在 shopify 上完成结帐时保存其他数据