以下陈述之间有什么区别吗?
SELECT DATEADD(MONTH, @SomeInteger * 12, @SomeDate)
SELECT DATEADD(YEAR, @SomeInteger, @SomeDate)
换句话说,是否存在对于 和 的相同值会产生不同结果的@SomeInteger
情况@SomeDate
?
我通过以下方式进行了快速测试:
SELECT
*
FROM dbo.DimDate dd
WHERE DATEADD(MONTH, 12, dd.Date) <> DATEADD(YEAR, 1, dd.Date)
它返回零记录,但这远不能证明这两个语句是等价的。
computer scalar
执行计划组件在两个查询中具有完全相同的成本,但定义ScalarOperator
不同 - 查询优化器似乎没有将一条语句转换为另一条语句。
谢谢!
在这种情况下,即使
ScalarOperator
定义不同,它们也是等效的行为。这是因为在其他情况下它们不能被交换。想一想:datediff
以天为单位,这取决于哪个月份,还必须考虑闰年。datediff
以秒为单位,当有闰秒时,这将是不确定的。SQL Server 不会获得任何优势,将一个标量运算符的定义更改为更像另一个的。会有什么好处?如果你说
WHERE column = 4 * 5
如果标量运算符说会不会令人困惑WHERE column = 2 * 10
?即使您在某处有另一个使用2 * 10
?换句话说,如果你说
DATEADD(MONTH, n*12, ...
我认为 SQL Server 完全没有理由将这个表达式更改为DATEADD(YEAR, n, ...
仅仅因为我们都碰巧知道一年有 12 个月。您要求按月而不是按年进行增量,所以这就是表达式应该显示的内容。