1. ホーム
  2. sql

SQL Serverでdate+timeから日付を取得する最も効率的な方法?

2023-09-04 19:59:41

質問

MS SQL 2000 および 2005 において、'2008-09-25 12:34:56' のような datetime が与えられた場合、'2008-09-25' のみを含む datetime を取得する最も効率的な方法は何でしょうか。

重複した ここで .

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

私は正直言って、Mattが示したフロア-フロート変換を今まで見たことがありませんでした。私はこれをテストしなければなりませんでした。

私は純粋なselect(これは日付と時刻を返すので、私たちが望むものではありません)、ここで君臨する解決策(floor-float)、ここで言及されている一般的な「ナイーブ」なもの(stringconvert)、私が使っていたここで言及されているもの(それが最も速いと思っていたので)をテストしました。

私はテスト サーバー MS SQL Server 2005 を、Xeon 3GHz CPU の Win 2003 SP2 サーバー上で最大メモリ (32 ビット、つまり約 3.5GB) で動作させてクエリをテストしました。私がいるところは夜なので、マシンはほとんど無負荷で動いています。私はそれをすべて自分自身のために持っています。

これは、ミリ秒レベルまで変化するタイムスタンプを含む大きなテーブルから選択した、私のテスト実行のログです。この特定のデータセットには、2.5 年以上にわたる日付が含まれています。テーブル自体には 1 億 3,000 万行以上あるので、上位 100 万行に制限している理由です。

SELECT TOP 1000000 CRETS FROM tblMeasureLogv2 
SELECT TOP 1000000 CAST(FLOOR(CAST(CRETS AS FLOAT)) AS DATETIME) FROM tblMeasureLogv2
SELECT TOP 1000000 CONVERT(DATETIME, CONVERT(VARCHAR(10), CRETS, 120) , 120) FROM tblMeasureLogv2 
SELECT TOP 1000000 DATEADD(DAY, DATEDIFF(DAY, 0, CRETS), 0) FROM tblMeasureLogv2

SQL Server のパースとコンパイル時間です。 CPU時間=0ms、経過時間=1ms。

(1000000 行が影響を受けました) テーブル 'tblMeasureLogv2' です。スキャン回数 1、論理読み込み 4752、物理読み込み 0、リードアヘッド読み込み 0、ロブ論理読み込み 0、ロブ物理読み込み 0、ロブリードアヘッド読み込み 0。

SQL Server の実行時間です。 CPU時間=422ms、経過時間=33803msです。

(1000000 行が影響を受けました) テーブル 'tblMeasureLogv2'. スキャン回数 1、論理リード 4752、物理リード 0、リードアヘッドリード 0、ロブ論理リード 0、ロブ物理リード 0、ロブリードアヘッドリード 0です。

SQL Server の実行時間です。 CPU時間=625ms、経過時間=33545ms。

(1000000 行が影響を受けました) テーブル 'tblMeasureLogv2' です。スキャン回数 1、論理リード 4752、物理リード 0、リードアヘッドリード 0、ロブ論理リード 0、ロブ物理リード 0、ロブリードアヘッドリード 0です。

SQL Server の実行時間です。 CPU時間=1953ms、経過時間=33843msです。

(1000000 行が影響を受けました) テーブル 'tblMeasureLogv2' です。スキャン回数 1、論理リード 4752、物理リード 0、リードアヘッドリード 0、ロブ論理リード 0、ロブ物理リード 0、ロブリードアヘッドリード 0です。

SQL Server の実行時間です。 CPU 時間 = 531 ms、経過時間 = 33440 ms。SQL Server のパースとコンパイル時間。CPU時間=0ms、経過時間=1ms。

SQL サーバーの実行時間。 CPU時間=0ms、経過時間=1ms。

ここでは何が見えているのでしょうか?

CPU時間に注目してみましょう(コンバージョンを見ています)、次のような数字が見えてきました。

Pure-Select:  422
Floor-cast:   625
String-conv: 1953
DateAdd:      531  

このことから、(少なくともこの特定のケースでは)DateAddはフロアキャストメソッドよりもわずかに高速であるように私には見えます。

その前に、クエリの順序を変更してこのテストを何回か実行しましたが、結果は同じでした。

これは、私のサーバーで何か奇妙なことなのでしょうか、それとも何でしょうか?