2009-08-01 6 views
0

SQL Server 2008を使用しています。私は、CreateTimeというdatetime型の列を持つテーブルを持っています。このテーブルから、CreateTimeが現在の時刻(UTC時刻)から3時間以上30分以内のすべてのレコードを選択する必要があります。私はT-SQLストアプロシージャを使用しています。SQL ServerのDateDiffでヘルプを要求します

ところで、CreateTime列は過去のある時刻です。

MSDNからDateDiffのヘルプを習得して検索するのにかなりの時間がかかりましたが、わかりません。誰か私にサンプルをお願いしますか?

事前のおかげで、 ジョージ

答えて

5

あなたは選択と分を使用してDATEDIFFとWHERE句を追加することができます:あなたが唯一のちょうど反対を使用し、離れて3日間と30分以上MOREあり、それらの行を望んでいるならば、

SELECT (fields) 
FROM (table) 
WHERE 
    DATEDIFF(MINUTE, CREATETIME, getutcdate()) <= (3*24*60 + 30) 

そしてもちろんのを:

WHERE 
    DATEDIFF(MINUTE, CREATETIME, getutcdate()) > (3*24*60 + 30) 

サンプル:

SELECT  
    DATEDIFF(MINUTE, '2009-08-01 08:00:00', getutcdate()), 
    DATEDIFF(MINUTE, '2009-07-31 20:00:00', getutcdate()), 
    DATEDIFF(MINUTE, '2009-07-23 20:00:00', getutcdate()) 

結果として与える:

96 816 12337 

したがって、最初の2つの日付はまだ4350分の括弧内にあります(3日前と30分前)。3番目の日付はさらに離れています。

マーク

+1

CREATETIMEがgetdateutc()より大きい場合、値は負の値になります。それは - (3 * 24 * 60 + 30) –

+1

でなければなりません。これは将来何らかの時間に作成される行でしょうか? :-)私にはタイムマシンのおじさんのように聞こえる...... –

+1

あなたの声明は正しいが、それは本当に起こるかどうか疑問に思う。 –

3

あなたはDATEADDが必要になります。

WHERE DATEADD(minute, 4350, CreateTime) <= getutcdate() 

それとも、あなたが述べたように、あなたがDATEDIFFを使用することができます。

WHERE DATEDIFF(minute, CreateTime, getutcdate()) <= 4350 

(4350は「3日で、 30分)

+1

の質問は、実際に3日を指定すると半分の時間ではなく、1日目:marc_sの答えを適応

。 – Amber

+1

よく捕らえられました。更新しました。 –

+0

リチャード、あなたのSQLステートメントで、最初のパラメータ '。'手段? – George2

2

1つの小文字の答えは正しいものの、正しいものです。列に関数を適用しないでください。関数を比較値に適用します。

CREATETIMEが索引付けされている場合は、列の関数を検索するのではなくスキャンです。 これが問題になるには何百万行も必要ありません。

SELECT (fields) 
FROM (table) 
WHERE 
    CREATETIME <= DATEADD(MINUTE, - (3*24*60 + 30), getutcdate()) 
関連する問題