Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么要为日期时间值定义加法运算符,而不为日期定义加法运算符?_Sql Server_Tsql_Datetime - Fatal编程技术网

Sql server 为什么要为日期时间值定义加法运算符,而不为日期定义加法运算符?

Sql server 为什么要为日期时间值定义加法运算符,而不为日期定义加法运算符?,sql-server,tsql,datetime,Sql Server,Tsql,Datetime,我知道解决方法是对这两种数据类型使用DATEADD。我想了解为什么语言设计者选择为一种数据类型定义此运算符,而不是为另一种数据类型定义此运算符 当您尝试在日期直接使用plus运算符时 DECLARE @tomorrow DATE = CONVERT(DATE, GETDATE()) + 1 您将收到以下错误消息: Msg 206,16级,状态2,第1行 操作数类型冲突:日期与int不兼容 但是,您可以将整数添加到日期时间,并且可以隐式地将该日期时间转换为日期,而不会出现错误: DECLARE

我知道解决方法是对这两种数据类型使用
DATEADD
。我想了解为什么语言设计者选择为一种数据类型定义此运算符,而不是为另一种数据类型定义此运算符

当您尝试在
日期直接使用plus运算符时

DECLARE @tomorrow DATE = CONVERT(DATE, GETDATE()) + 1
您将收到以下错误消息:

Msg 206,16级,状态2,第1行
操作数类型冲突:日期与int不兼容

但是,您可以将整数添加到
日期时间
,并且可以隐式地将该
日期时间
转换为
日期
,而不会出现错误:

DECLARE @thisTimeTomorrow DATETIME = GETDATE() + 1
DECLARE @tomorrow DATE = GETDATE() + 1

这是因为出于兼容性目的,SQL Server日期时间行为保持不变。自从2008版DATETIME2引入以来,它禁止添加整数,DATE也同时引入,这也禁止添加

最简单的解决方案是将加法移到转换中:

DECLARE @tomorrow DATE = CONVERT(DATE, GETDATE()+1)
虽然我建议使用DATEADD而不是整数加法进行计算:

DECLARE @tomorrow DATE = CONVERT(DATE, DATEADD(DD,+1,GETDATE()))

谢谢。

Microsoft SQL Server源于Sybase代码库,在该代码库中,加法运算符可以将日期时间与数字结合起来,并生成数据时间。根据ANSI SQL标准,这样一个表达式的结果应该产生一个区间类型(MSSQL中不存在)


Microsoft开发的较新的time、date、datetime2、datetimeoffset数据类型有意不支持这种有利于ANSI标准的遗留行为。必须使用内置的DATEADD函数。

不要使用
+1
-您真正添加的是什么?1小时?一天?一年?使用更合适的
DATEADD()
方法,该方法允许您清楚地说明要添加的内容—一年中的毫秒数…..可能是语言的重复,出于兼容性原因,设计者可能不得不将加法运算符放在那里—可能与Oracle兼容(或者甲骨文也决定仿效的东西——Sybase,DB2,谁知道呢)。对于
date
,没有理由这样做,因为它是相对较新的;当然,从
datetime
中删除它不再是一个选项。@marc_s“不要使用+1-你真正增加了什么?1小时?1天?1年?”有趣的是,答案是有一天,我会错误地猜到1毫秒。除非SQL Server开发团队就这个问题发表了官方帖子,否则我会说它只能吸引推测性的答案。
DATE
存储为1,3字节整数,而不是
NTEXT
。检查一下,谢谢。我们学到了一些东西每天都有新的。前提仍然是一样的,整数加法必须在转换操作中移动。我在对这个问题进行了一些研究后编辑了我的答案。似乎DATETIME在所有密集用途中都是“depracated”,但保留用于遗留代码问题。DATETIME2是SQL Server自2008年以来的官方datetime对象,应该使用,但老实说,我自己从未使用过。感谢您的输入。