sql - SQL 服务器 DATEADD() 函数中的间隔类型是什么?

例如:

SELECT DATEADD(month, 2, '2017/08/25') AS DateAdd;

我认为将参数定义为指定的数据类型(例如字符)会更有意义,就像 OBJECT_ID 函数中的 'U' 参数一样

IF OBJECT_ID('dbo.Digits', 'U') IS NOT NULL 
    DROP TABLE dbo.Digits;

那么从 month'month' 定义参数在技术上不是更正确吗:

SELECT DATEADD('month', 2, '2017/08/25') AS DateAdd;

month 是 SQL 服务器中的数据类型吗?

我可以认为它类似于 C 中的宏,例如:

#define month "month"

那么 SQL 服务器中的 month 是什么?

回答1

MONTH 不是数据类型(在此上下文或任何其他上下文中),它是已定义的参数(将其视为常量)。 https://docs.microsoft.com/en-us/sql/t-sql/functions/dateadd-transact-sql。为什么它不包含在字符串中?您必须找到 30 年前编写代码的人并询问他们。该文件甚至说(使用 [my clarification added]):

DATEADD 不接受用户定义的等效变量 [例如strings] 用于 datepart 参数。

https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-big-transact-sql 说得更好,恕我直言:

DATEDIFF_BIG 不接受来自用户定义变量的日期部分 values 或引用的字符串。

这可能是由于当时解析器的编写方式以及 30 年后没有理由更改它,因为有人不喜欢它。 :-) 除了上述两个函数之外,您还必须更改 DATENAMEDATEDIFFDATEPART 等以保持一致。在 SQL 服务器生命周期的这个阶段,我只是看不到好处。

DATE* 函数并不孤单。像这样的另一个示例是 OPENQUERY,您可以认为它应该能够为任一参数获取变量,或者为第一个参数获取代表服务器的字符串(与 OPENDATASOURCEOPENROWSET 更加一致)。但是https://docs.microsoft.com/en-us/sql/t-sql/functions/openquery-transact-sql指出:

OPENQUERY 的参数不接受变量。

接下来,你问:

所以从技术上定义从月份到“月份”的参数不是更正确吗:

也许?对我来说似乎很主观。很多事情在技术上会比它们当前的实现更正确(我的意思是,想象一下如果每个软件的 v1.0 在各个方面都是完美的),但这并不能使它们易于更改,仅此一点也不总能提供良好的动力考虑改变。

相似文章

随机推荐

最新文章