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对象,应该使用,但老实说,我自己从未使用过。感谢您的输入。