修正しようとしている SQL レポートでこのコード行に出くわしました。誰かがこれの目的を教えてください。
DATEADD(dd, - DATEDIFF(dd, d.TxnDateTime, 1), 1) As TxnDate
私には、それ自体がキャンセルされるように思えます。
修正しようとしている SQL レポートでこのコード行に出くわしました。誰かがこれの目的を教えてください。
DATEADD(dd, - DATEDIFF(dd, d.TxnDateTime, 1), 1) As TxnDate
私には、それ自体がキャンセルされるように思えます。
これはおそらく SQL Server 2005 用に作成されたものでCONVERT(DATE
あり、一部の Microsoft 従業員の目にはほんのわずかしか映っていませんでしたが、面倒で非効率的で説明が難しい回避策を使用してDATETIME
.
もちろん、人々は今でもこれらの面倒で効率的で説明が難しい方法を使用しています。しかし、特に、特定の開発者がその特定のケースでその特定のフォーマットを選択した理由を探している場合は、ここで誰もその理由を説明できるとは思いません. 私たちは単に彼らのために話すことはできません. たぶん彼らはそれをどこかから盗んだのかもしれませんし、実際には彼らにとって意味があるのかもしれません。
今日、より良いアプローチは次のとおりです。
CONVERT(DATE, d.TxnDateTime);
d.TxnDateTime
ここで、特定の日に該当するすべての行を取得しようとしている場合、はるかに優れたアプローチは、DATE
パラメーターと無制限の範囲クエリを使用することです。
WHERE d.TxnDateTime >= @ThatDay
AND d.TxnDateTime < DATEADD(DAY, 1, @ThatDay);
これは次のものよりも優れています。
WHERE CONVERT(DATE, d.TxnDateTime) = @ThatDay;
なぜなら、その式は sargable ですが、カーディナリティの推定値がかなり低くなる可能性があるためです。詳細については、この非常に詳細な投稿を参照してください。
https://dba.stackexchange.com/questions/34047/cast-to-date-is-sargable-but-is-it-a-good-idea
また、これを読むのも悪い考えではないかもしれません:
https://sqlblog.org/2009/10/16/bad-habits-to-kick-mis-handling-date-range-queries
また、これに関してdd
:
https://sqlblog.org/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations
データ型を変更せずに のTIME
部分を削除しています。DATETIME
ここで異なる動作を確認できます: SQL Fiddle
繰り返しますが、データ型DATETIME
よりも前の日付でない限り、時間を削除しながら型を保持する必要がある理由がわかりません。DATE
データ型は、MSDN ごとDate
に SQL 2008 で追加されました。SQL 2008 より前は、この式は変数から時間を切り捨てる 1 つの方法でした。DateTime