【发布时间】:2015-04-17 09:33:33
【问题描述】:
我知道解决方法是对这两种数据类型都使用DATEADD。我想了解为什么语言设计者选择为一种数据类型而不是另一种数据类型定义此运算符?
当您尝试直接在 DATE 上使用加号运算符时
DECLARE @tomorrow DATE = CONVERT(DATE, GETDATE()) + 1
您收到此错误消息:
消息 206,第 16 级,状态 2,第 1 行
操作数类型冲突:日期与 int 不兼容
但是,您可以将整数添加到 DATETIME,并且可以将 DATETIME 隐式转换为 DATE 而不会出现错误:
DECLARE @thisTimeTomorrow DATETIME = GETDATE() + 1
DECLARE @tomorrow DATE = GETDATE() + 1
【问题讨论】:
-
不要使用
+ 1- 你真正添加了什么? 1小时? 1天? 1年?使用更合适的DATEADD()方法,它可以让您清楚地说明您要添加的内容 - 毫秒到一年..... -
出于兼容性原因,语言设计者可能不得不将加法运算符放在那里 - 可能是与 Oracle(或者可能是 Oracle 也决定模仿的东西 - Sybase、DB2,谁知道)。
date没有理由这样做,因为它是相对较新的;当然,从datetime中删除它不再是一种选择。 -
@marc_s “不要使用 + 1 - 你真正添加了什么?1 小时?1 天?1 年?”有趣的是,答案是有一天,我猜错了 1 毫秒。
-
除非 SQL Sever 开发团队就这个问题发表了官方帖子,否则我会说它只能吸引推测性的答案。
标签: sql-server tsql datetime