我有一个学术场景,我想知道如何分析。
DECLARE @date DATETIME
SET @date = getDate()
SET @date = DATEADD(DAY, DATEDIFF(DAY, 0, @date-3), 3)
这会将日期四舍五入到星期四。
我所面临的挑战是证明隐式 CAST的位置。
有三个地方,我认为这必须发生......
DATEADD(
DAY,
DATEDIFF(
DAY,
0, -- Implicitly CAST to a DATETIME?
@date-3 -- I presume the `3` is being implicitly cast to a DATETIME?
),
3 -- Another implicit CAST to a DATETIME?
)
但是,由于0
和3
是常量,这可以在编译到执行计划期间完成吗?
但如果3
是INT变量,那会不同吗?
有没有办法分析执行计划或其他方法,以便能够不确定地确定这个?
为了使问题更复杂,我现在不在现场。我正试图远程协助同事。这意味着我无法直接访问SSMS等。
答案 0 :(得分:7)
查询
DECLARE @date DATETIME = getDate()
DECLARE @N INT = 3
SELECT DATEADD(DAY, DATEDIFF(DAY, 0, @date-3), 3)
FROM master..spt_values
SELECT DATEADD(DAY, DATEDIFF(DAY, 0, @date-@N), @N)
FROM master..spt_values
查看执行计划,计算标量显示以下内容。
[Expr1003] = Scalar Operator(dateadd(day,datediff(day,'1900-01-01 00:00:00.000',[@date]-'1900-01-04 00:00:00.000'),'1900-01-04 00:00:00.000'))
[Expr1003] = Scalar Operator(dateadd(day,datediff(day,'1900-01-01 00:00:00.000',[@date]-CONVERT_IMPLICIT(datetime,[@N],0)),CONVERT_IMPLICIT(datetime,[@N],0)))
显示您的怀疑是正确的,它在文本值的编译时发生但在运行时需要CONVERT_IMPLICIT
的int变量