gpt4 book ai didi

sql-server - 如何返回与参数相同的类型

转载 作者:行者123 更新时间:2023-12-03 08:29:08 24 4
gpt4 key购买 nike

在 SQL Server 中,我需要包装 DATEADD内置函数与另一个函数。

问题是我需要实现这个行为:

Return Types

The return data type is the data type of the date argument[...]

例如,如果我传入一个 datetime 作为参数,DATEADD 返回一个 datetime。如果我传入一个 dateDATEADD 会返回一个 date

下面的例子总是返回datetime...

create function add_months(@dt date, @interval int) 
returns datetime
as
begin
return DATEADD(month, @interval, @dt)
end

我如何在 SQL Server 中实现它?

(编辑)

上下文

我正在执行从 informix 到 SQL Server 的数据库迁移。数据库部分不是这里的问题,代码才是。由于嵌入了 SQL 查询,我们有数百个程序必须更改。这是我试图避免使用 DATEADD(MONTH, 1, foo) 的主要原因。这种自动 转换虽然在大多数情况下很简单,但在某些情况下可能非常困难。使用 udf,我可以只替换 informix 函数的名称,而无需进行更深入的重构。

最佳答案

重载函数是不可能的。我正在尝试想办法将 SQL_VARIANT 塞入其中,但我能想到的所有选项都会导致不必要的令人厌恶的并发症。我会制作一个接受并返回日期的函数,以及一个接受并返回日期时间的函数,然后调用适当的函数。精度较低的可以调用精度较高的,因此您不必复制代码,例如

CREATE FUNCTION dbo.add_months_to_datetime
(@dt DATETIME, @interval INT)
RETURNS DATETIME
AS
BEGIN
RETURN DATEADD(MONTH, @interval, @dt);
END
GO

CREATE FUNCTION dbo.add_months_to_date
(@dt DATE, @interval INT)
RETURNS DATE
AS
BEGIN
RETURN dbo.add_months_to_datetime(@dt, @interval);
END
GO

或者,始终使用最高精度(第一个函数),并在呈现数据时担心它是日期还是日期时间。您可以使用内联转换或将其适本地包装在另一个函数中来执行此操作。

编辑

或者更好的是,只需用适当的内联 dateadd 调用替换对这个有问题的函数的所有调用。

dbo.add_months(foo, 1)

变成:

DATEADD(MONTH, 1, foo)

虽然它不像您希望的那样自动,但除了保持输出类型与输入相同的要求外,这还可能会提高某些查询的性能,具体取决于查询中使用这些查询的位置。

关于sql-server - 如何返回与参数相同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348855/

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