2

そのため、最近の私の仕事では、月をgetdate()(または日時の列から)取得するのに最適な方法について意見の相違があります。

これを行うには、かなり標準的な方法が2つあります。

方法#1:

select DateAdd(Day, 0, DateDiff(Day, 0, Getdate())) 

そして方法#2:

select Cast(Floor(Cast(Getdate() as Float)) as Datetime) 

私は方法2の大ファンです。内部化がはるかに簡単で、(わずかに)高速であることがわかったからです。ただし、これを行うには、方法1が標準的な方法であると言われています。私の質問はなぜですか?武器庫の日付から1か月をとる方法として、この2つのうちどちらが最適でしょうか。また、その理由は何ですか。

4

4 に答える 4

4

SQL Server 2008では、次の点にも満足しています。

SELECT CONVERT(DATE, CURRENT_TIMESTAMP);

はるかに単純で自己文書化されていることに加えて、これは、変換を列に適用してもインデックスを利用できる1つの例外です。たとえば、両方がほぼ同じパフォーマンスをもたらす場合、どちらが読みやすいですか?

WHERE CONVERT(DATE, col) = CONVERT(DATE, CURRENT_TIMESTAMP)

WHERE col >= CONVERT(DATE, CURRENT_TIMESTAMP) -- or any of your alternatives
AND col < DATEADD(DAY, 1, CONVERT(DATE, CURRENT_TIMESTAMP))

これらの3つの方法のうち、パフォーマンスの違いはごくわずかであると思われるかもしれませんが、それらを単独でテストすることは、私見ではほとんど価値がありません。日付から何百万回も単独で時間を削除する頻度はどれくらいですか。実際のクエリの一部として同じセマンティクスが与えられた場合、DATEDIFF、FLOOR、またはCONVERTを使用するコストは考慮されないことがわかります。

余談ですが、結果を明示的なDATETIMEまたはSMALLDATETIME変数/列に割り当てる場合、またはwhere句を介して暗黙的に割り当てる場合は、DATEADD部分をスキップできます。

SELECT CONVERT(DATETIME, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP));
于 2012-06-07T03:36:19.903 に答える
2

前者の方が浮動小数点演算を必要とせず、日時の内部ストレージの最初の整数にアクセスするだけでよいので、前者の方が優れていると思います。これも見てください

于 2012-06-07T03:04:30.000 に答える
2

テストするスクリプトを実行しましたが、メソッド#1とメソッド#2はどちらも速度が非常に似ていました。チャールズブレタナによって投稿された回答は、実際にはすべてのテストで遅かった。確かに、これらはかなり非科学的であるため、自分でテストしてください。これが私が書いたスクリプトです:

declare @starttime datetime
declare @endtime datetime

set @starttime = GETDATE()
print convert(varchar(30), @starttime, 109)

declare @cnt int
set @cnt = 0

declare @datevar datetime

while @cnt < 10000000
begin

    select @datevar = DateAdd(Day, 0, DateDiff(Day, 0, Getdate())) -- Replace this with whichever function you'd like to test
        , @cnt = @cnt + 1
end

set @endtime = GETDATE()
print convert(varchar(30), @endtime, 109)

print cast(datediff(ms, @starttime, @endtime) as varchar(20)) + ' ms'

select @datevar=lineを適切なものに置き換えるだけです。私の開発マシンでは、メソッド1と2は通常7200〜7300ミリ秒で実行されました。チャールズによって投稿された方法は、通常、平均8300〜8500ミリ秒です。

于 2012-06-07T03:21:20.493 に答える
1

getdate()から月を取得するには:

SELECT DATEPART(MONTH, GETDATE())
于 2012-06-07T10:23:14.877 に答える