sql - 在 STORE PRODECURE 中的 SQL SERVER 中使用 DATENAME
问题描述
我有这个带有 3 个参数的存储过程 -1:开始日期 -2:结束日期 -3:天
CREATE PROCEDURE TEST (@start_date DATE,@end_date DATE,@name_days VARCHAR(MAX))
AS
BEGIN
DECLARE @NUMBER_DAYS INT;
;with AllDates AS
(
SELECT @start_date AS DateOf
UNION ALL
SELECT DateAdd(day,1,DateOf)
FROM AllDates
WHERE DateOf<@end_date
)
select SUM(CASE WHEN DATENAME(weekday,dateof) in (@name_days) THEN 0 ELSE 1 END) as SumOfDays
FROM AllDates;
END
我的问题是我需要知道我是否可以像示例一样在执行过程中添加两个天的名称(但这对我不起作用有人有任何建议!以及如何做)
EXEC TEST '2020-07-01','2020-07-13','Monday Tuesday'
解决方案
一种方法是使用表类型参数。我还从使用 rCTE 的迭代(和缓慢)方法切换到更快的 Tally Table。
但是,理想情况下,如果您想更定期地执行此操作,最好使用日历表(使用您最喜欢的搜索引擎,您会找到 1000 个有关如何构建这些的示例)而不是内联相符。
无论如何,使用表类型参数,您可以执行以下操作:
USE Sandbox;
GO
CREATE TYPE dbo.DayNames AS table(DayName varchar(15));
GO
CREATE PROC dbo.TEST @StartDate date, @EndDate Date, @DayNames dbo.DayNames READONLY AS
BEGIN
WITH N AS(
SELECT N
FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
SELECT TOP (SELECT DATEDIFF(DAY, @StartDate, @EndDate) +1)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
FROM N N1, N N2, N N3, N N4), --10,000 days
Dates AS(
SELECT DATEADD(DAY, T.I, @StartDate) AS Date,
DATENAME(WEEKDAY, DATEADD(DAY, T.I, @StartDate)) AS DayName
FROM Tally T)
SELECT COUNT(*) AS NumOfDays
FROM Dates D
JOIN @DayNames DN ON D.DayName = DN.DayName;
END;
GO
DECLARE @DayNames dbo.DayNames;
INSERT INTO @DayNames
VALUES ('Monday'),('Tuesday');
EXEC dbo.TEST '20000101', '20200817', @DayNames;
GO
--Cleanup
DROP PROC dbo.TEST;
DROP TYPE dbo.DayNames;
如果您不想使用表类型参数,则可以传入一个分隔列表,然后使用字符串拆分器,例如STRING_SPLIT
(在 SQL Server 2016+ 中)或用户构建的函数,例如DelimitedSplit8K_LEAD
(Google it)。
推荐阅读
- python - 使用 docker + django + nginx 时不提供静态文件
- sql - 通过变量从数据集中计算统计数据
- c# - MVVM - 可用于多个视图模型的模型数据
- python - 将单独的熊猫数据框中的列相乘
- postgresql - 将大文件上传到 AWS aurora postgres 无服务器
- regex - preg_replace 最后一个字符
- spring - Spring Boot Scheduler 未在预定时间触发
- azure - 可以向 Azure Data Lake(第 1 代)发送多少请求是否有限制?
- html - React Bootstrap 导航栏主页选项卡总是突出显示
- excel - 添加通配符搜索和其他条件