gpt4 book ai didi

sql-server - SQL UDF 返回日期数组

转载 作者:行者123 更新时间:2023-12-02 11:19:49 25 4
gpt4 key购买 nike

我目前编写了一个小型 UDF(表值类型)来返回开始日期和结束日期之间的日期。开始日期和结束日期已从另一个表中检索。

Start_End_Table
WeekNumber | Start Date | End Date

功能:

CREATE FUNCTION [dbo].[DatesBetween](@startDate datetime, @endDate datetime)
RETURNS @dates TABLE (
DateValue datetime NOT NULL
)
AS
BEGIN
WHILE (@startDate <= @endDate) BEGIN
INSERT INTO @dates VALUES (@startDate);
SET @startDate = DATEADD(day, 1, @startDate);
END;

RETURN;
END;

到目前为止,我一直按以下方式使用此功能,

SELECT * FROM [dbo].[DatesBetween](@startDate datetime, @endDate datetime);

接下来我需要从 Start_End_Date 表中获取开始日期和结束日期并调用该函数。因此,我认为返回table不再是一个选项。如何让这个函数返回日期数组而不是表格?或者还有其他方法可以解决这个问题吗?

最佳答案

尝试 CROSS APPLY,因为它将为 JOINed 表中的每一行运行该函数:

SELECT [Date Value]
FROM dbo.Start_End_Table dates
CROSS APPLY [dbo].[DatesBetween](dates.StartDate, dates.EndDate)
WHERE [Week Number]=@WeekNumber;

示例输出类似于开始日期 = 1/1/2014、结束日期 = 1/3/2014、@weeknumber = 1:

 | DateValue
1/1/2014
1/2/2014
1/3/2014

SQL Fiddle

编辑:
尝试以下内联表值函数,因为它比多行 TVF 快得多,因为:

  1. 内联 TVF 本质上比多线 TVF 更快
  2. 它是基于集合的,而不是依赖于 WHILE 循环

--

CREATE FUNCTION dbo.GetDates(@StartDate DATETIME, @EndDate DATETIME)
RETURNS TABLE
AS RETURN
WITH cte AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS [RowNum]
FROM sys.objects WITH (NOLOCK)
)
SELECT DATEADD(DAY, (cte.[RowNum] - 1), @StartDate) AS [DateValue]
FROM cte
WHERE cte.[RowNum] < (DATEDIFF(DAY, @StartDate, @EndDate) + 2);
GO

SELECT * FROM dbo.GetDates('1/1/2014', '1/3/2014');

关于sql-server - SQL UDF 返回日期数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24901192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com