Return 来自标量函数 SELECT 查询的 smalldatetime 值
Return smalldatetime value from scalar function SELECT query
我想在 SQL 服务器 (2017) 中创建一个标量函数,它利用日历 table 我建立了一段时间以计算和 return 一个日期从给定日期向前的给定工作日数。我一直在为如何适当地传回 SMALLDATETIME
return 值而苦恼。想知道我在尝试什么:
CREATE FUNCTION dbo.AddBusDaysToDate
(
@startDate SMALLDATETIME,
@numBusDays INT,
)
RETURNS SMALLDATETIME
AS
BEGIN
DECLARE @rs SMALLDATETIME;
SELECT @rs = TOP(1) dt
FROM (
SELECT TOP(@numBusDays) dt
FROM dbo.OurCalendar
WHERE isWeekday = 1
AND isHoliday = 0
AND dt >= @startDate
ORDER BY dt ASC
) as ID
ORDER BY dt DESC
RETURN @rs
END
dt
是我们日历 table 上的 SMALLDATETIME
数据类型。
当为变量插入值时,查询本身按预期运行,但我试图重新调整一个类似的函数的用途,该函数使用不同的数据类型计算日历上两点之间的工作日差异。因此,我不确定我是否在连续拉到 @rs 而不是单个值,或者如何从 SELECT 查询结果中 separate/isolate 那个特定的 'cell' 。我想我可能遗漏了一些非常简单的东西。
任何帮助或正确方向的观点将不胜感激。
我能够通过以下方式解决:
CREATE FUNCTION dbo.AddBusDaysToDate
(
@startDate SMALLDATETIME,
@numBusDays INT,
)
RETURNS SMALLDATETIME
AS
BEGIN
DECLARE @rs SMALLDATETIME;
DECLARE @workdayModifier INT;
IF EXISTS (
SELECT dt FROM dbo.OurCalendar
WHERE dt = @startDate
AND isWeekday = 1
AND isHoliday = 0
)
SET @workdayModifier = 1
ELSE
SET @workdayModifier = 0
SELECT TOP(1) @rs = dt
FROM (
SELECT TOP(@numBusDays + @workdayModifier) dt
FROM dbo.OurCalendar
WHERE isWeekday = 1
AND isHoliday = 0
AND dt >= @startDate
ORDER BY dt ASC
) as ID
ORDER BY dt DESC
RETURN @rs
END
我想在 SQL 服务器 (2017) 中创建一个标量函数,它利用日历 table 我建立了一段时间以计算和 return 一个日期从给定日期向前的给定工作日数。我一直在为如何适当地传回 SMALLDATETIME
return 值而苦恼。想知道我在尝试什么:
CREATE FUNCTION dbo.AddBusDaysToDate
(
@startDate SMALLDATETIME,
@numBusDays INT,
)
RETURNS SMALLDATETIME
AS
BEGIN
DECLARE @rs SMALLDATETIME;
SELECT @rs = TOP(1) dt
FROM (
SELECT TOP(@numBusDays) dt
FROM dbo.OurCalendar
WHERE isWeekday = 1
AND isHoliday = 0
AND dt >= @startDate
ORDER BY dt ASC
) as ID
ORDER BY dt DESC
RETURN @rs
END
dt
是我们日历 table 上的 SMALLDATETIME
数据类型。
当为变量插入值时,查询本身按预期运行,但我试图重新调整一个类似的函数的用途,该函数使用不同的数据类型计算日历上两点之间的工作日差异。因此,我不确定我是否在连续拉到 @rs 而不是单个值,或者如何从 SELECT 查询结果中 separate/isolate 那个特定的 'cell' 。我想我可能遗漏了一些非常简单的东西。
任何帮助或正确方向的观点将不胜感激。
我能够通过以下方式解决:
CREATE FUNCTION dbo.AddBusDaysToDate
(
@startDate SMALLDATETIME,
@numBusDays INT,
)
RETURNS SMALLDATETIME
AS
BEGIN
DECLARE @rs SMALLDATETIME;
DECLARE @workdayModifier INT;
IF EXISTS (
SELECT dt FROM dbo.OurCalendar
WHERE dt = @startDate
AND isWeekday = 1
AND isHoliday = 0
)
SET @workdayModifier = 1
ELSE
SET @workdayModifier = 0
SELECT TOP(1) @rs = dt
FROM (
SELECT TOP(@numBusDays + @workdayModifier) dt
FROM dbo.OurCalendar
WHERE isWeekday = 1
AND isHoliday = 0
AND dt >= @startDate
ORDER BY dt ASC
) as ID
ORDER BY dt DESC
RETURN @rs
END