1

修正しようとしている SQL レポートでこのコード行に出くわしました。誰かがこれの目的を教えてください。

DATEADD(dd, - DATEDIFF(dd, d.TxnDateTime, 1), 1) As TxnDate

私には、それ自体がキャンセルされるように思えます。

4

4 に答える 4

6

これはおそらく 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

于 2013-12-13T19:41:40.237 に答える
5

データ型を変更せずに のTIME部分を削除しています。DATETIMEここで異なる動作を確認できます: SQL Fiddle

繰り返しますが、データ型DATETIMEよりも前の日付でない限り、時間を削除しながら型を保持する必要がある理由がわかりません。DATE

于 2013-12-13T19:37:26.330 に答える
1

データ型は、MSDN ごとDateに SQL 2008 で追加されました。SQL 2008 より前は、この式は変数から時間を切り捨てる 1 つの方法でした。DateTime

于 2013-12-13T19:41:22.227 に答える