在SQL Server 2012中,运算符>+与>=有何不同?

7
今天我无意间运行了一个SQL语句,用于按日期过滤一些项目。为简便起见,我们假设我使用了以下代码:
SELECT * 
FROM [TableName] 
WHERE [RecordCreated] >+ '2016-04-10'

只有在语句运行后,我才意识到我使用了 >+ 而不是 >=,现在我感到困惑,因为我本来期望会出现错误。

我尝试了一些其他的变化,例如

>- -- Throws an error
<+ -- Ran successfully
<- -- Throws an error

当我使用 >= 或 >+ 时,返回的行数完全相同。

在网上搜索后,我没有找到涵盖这种语法的文档,只有在两个运算符分开使用时才有。

RecordCreated 列是一个 datetime 类型。

这只是语法上的一种美观或可能常见错误的方式,还是试图将日期强制转换为数字值的潜在方法?


3
有趣。我原本期望这可以使用+作为一元运算符进行解析(https://msdn.microsoft.com/en-us/library/ms174362.aspx)。然而,我对它在字符串/日期字面量上也能起作用感到惊讶。 - Gordon Linoff
5
不是一个操作符,而是两个相邻的操作符。如果有任何行的' RecordCreated '恰好等于' 2016-04-10 ',则会得到不同的结果。 - Damien_The_Unbeliever
2
这可能是解析器或文档中的错误。SELECT +'plus!'会产生plus!,尽管按照所有记录来看它不应该,因为一元加号据说只适用于数字类型,而字符串连接运算符需要另一个表达式。(由于字符串仍然是字符串,这不是T-SQL对隐式转换的迷恋导致问题的情况之一。) - Jeroen Mostert
类型为datetime,将更新问题以反映该信息。 - samuelmr
3
MSFT: 这种行为是设计如此,因为+是一元运算符。因此解析器接受“+ <表达式>”,在这种情况下'+'会被简单地忽略。 https://connect.microsoft.com/SQLServer/feedback/details/718176/concatenation-operator-not-working-properly - Alex K.
显示剩余5条评论
2个回答

1
这似乎是“+”运算符的一个错误。根据微软团队的更新,
经过一些调查,这种行为是设计上的,因为“+”是一个一元运算符。所以解析器接受“+”,在这种情况下“+”被简单地忽略。改变这种行为会有很多向后兼容性的影响,因此我们不打算改变它,修复将为应用程序代码引入不必要的更改。
你可以在RGO关于他自己问题的非常好的答案中找到答案here

-2

结果不应该与">="和"<="匹配,而应该与">"和"<"匹配。刚刚检查了一下,行数变化了2个 - 第一个和最后一个项目被移除了。


我刚刚尝试了你的示例,>、>+和>=的计数是相同的。正如@Damien_The_Unbeliever所说,如果有一条记录完全匹配,那么结果可能会改变,我还没有尝试过这个测试。 - samuelmr
好的,了解这个信息很有趣。我刚刚在一个“标准”的日期维度表上尝试了一下,通过日期进行了筛选...正如之前提到的,如果我使用 >+ 和 <+,那么第一个和最后一个日期会被跳过。 - Tyron78
当我传入一个精确匹配的日期'2016-04-11 09:27:51.217'时,">="和">+"之间的计数相差1,这表明">+"确实忽略了精确匹配。但是似乎并不影响最后一行。 - samuelmr
当我查询“where datum >+ '2016-01-01' AND datum <+ '2016-01-10'”时,1月1日和1月10日被删除了。 - Tyron78

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接