5

分析方法を知りたい学術的なシナリオがあります。

DECLARE @date DATETIME
SET     @date = getDate()
SET     @date = DATEADD(DAY, DATEDIFF(DAY, 0, @date-3), 3)

これにより、日付が木曜日に切り捨てられます。

私が挑戦してきたのは、暗黙の CAST がある場所を証明することです。

これは、これが起こっているに違いないと私が推定する3つの場所です...

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?
)

しかし、おそらく と03定数なので、これは実行計画へのコンパイル中に行われるのでしょうか?

しかし、3が INT 変数である場合、それは異なるでしょうか?


これを帝国的に決定できるように、実行計画またはその他の方法を分析する方法はありますか?

さらに複雑なことに、私は現在現場を離れています。これで同僚をリモートで支援しようとしています。つまり、SSMS などに直接アクセスできないということです。

4

1 に答える 1

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

実行計画を見ると、計算スカラーは次のようになります。

クエリ 1

[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'))

クエリ 2

[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 変数の実行時に必要であるという疑いが正しいことを示しています

于 2012-08-16T14:58:36.690 に答える