1. ホーム
  2. sql

[解決済み】SQL Serverでdatetimeの時間部分を削除する最良の方法

2022-05-04 10:17:49

質問

SQL Serverでdatetimeフィールドから時間部分を削除する場合、どの方法が最も良いパフォーマンスを提供しますか?

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

または

b) select cast(convert(char(11), getdate(), 113) as datetime)

2番目の方法は、どちらにしても数バイト多く送信されますが、それは変換のスピードほど重要ではないかもしれません。

また、どちらも非常に高速に見えますが、数十万行以上扱う場合は速度に差が出るかもしれませんね?

また、SQLでdatetimeの時間部分を取り除くには、さらに良い方法があるのでしょうか?

どのように解決するのですか?

厳密には、メソッド a が最もリソースを消費しない。

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)

100万行と同じ時間でCPU負荷が低いことが、時間を持て余した誰かによって証明された。 SQL Serverでdate+timeから日付を取得する最も効率的な方法とは?

私も他で同じようなテストを見ましたが、同じような結果でした。

私はDATEADD/DATEDIFFの方が好きだからです。

  • varchar は言語/日付フォーマットの問題があります。

    なぜ私のCASE式は非決定的なのですか?
  • floatは内部ストレージに依存する
  • を変更することで、月の初日や明日などの計算を行うことができます。

2011年10月編集

SQL Server 2008+の場合、CASTで date すなわち CAST(getdate() AS date) . または、単に date のデータ型がないため time を削除してください。

編集部, 2012年01月

柔軟性の高さを示す作業例です。 SQLサーバーで丸められた時間や日付の数字で計算する必要があります。

編集部, 2012年05月

何も考えずに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)