SQL Server の datetime フィールドから時刻部分を削除するときに、最もパフォーマンスのよい方法はどれですか?
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
または
b) select cast(convert(char(11), getdate(), 113) as datetime)
2 番目の方法では、いずれにしてもさらに数バイトが送信されますが、これは変換の速度ほど重要ではない可能性があります。
どちらも非常に高速であるように見えますが、数十万行以上の行を処理する場合は速度に違いがある可能性があります。
また、SQL で日時の時刻部分を削除するさらに優れた方法がある可能性はありますか?
ベストアンサー1
厳密に言えば、メソッドはa
リソースを最も消費しません。
a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
時間を持て余している人が 100 万行を同じ合計期間で処理しても CPU の負荷が少ないことが証明されています。SQL Server で日付 + 時刻から日付を取得する最も効率的な方法は何ですか?
他の場所でも同様のテストが行われ、同様の結果が得られました。
DATEADD/DATEDIFF を推奨する理由:
- varchar は言語/日付形式の問題の影響を受けます
例:CASE 式が非決定的であるのはなぜですか? - floatは内部ストレージに依存します
- 「0」を基準に変更することで、月の最初の日、明日などを計算するように拡張されます。
編集、2011年10月
date
SQL Server 2008+ の場合、 ieに CAST できますCAST(getdate() AS date)
。または、削除しdate
ないようにデータ型を使用するだけですtime
。
編集、2012年1月
これがいかに柔軟であるかを示す実例:SQL Server で丸められた時間または日付の数値で計算する必要がある
編集、2012年5月
これをWHERE句などで考えずに使用しないでください。列に関数またはCASTを追加すると、インデックスの使用が無効になります。ここの2番を参照してください。よくあるSQLプログラミングの間違い
さて、これは、SQL Server オプティマイザーの最近のバージョンが日付への CAST を正しく管理する例ですが、一般的には悪い考えです...
2018年9月、datetime2 の編集
DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'
select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)