2016-08-22 18 views
1

私はSQLクエリを持っています...DATEADD今から30日を除いて

このクエリを今日の日付から実行すると、2011年7月22日に返されたレコードが返されます。

SELECT test_id, lat, long 
FROM testDB.src.test_20 
WHERE test_date >= DATEADD(day,-32, GETDATE()) and lat is not null and long is not null 

DATEADD関数を-31に変更すると、2011年7月23日からレコードが取得されます。

SELECT test_id, lat, long 
FROM testDB.src.test_20 
WHERE test_date >= DATEADD(day,-31, GETDATE()) and lat is not null and long is not null 

DATEADD機能の仕組みをはっきりと理解できていない可能性があります。 -31を使用したときに起こると思われることは、今日から31日前までのレコードで、2016年7月22日のレコードを返します(今日から31日前は、2011年7月22日です)。

-31を使用すると、なぜ2011年7月22日以降のレコードが返されないのですか?

SQL Server Management Studioの2012

+1

'DATEADD(day、-32、GETDATE())'はタイムスタンプも返します。これを実行すると、 'test_date'のタイムスタンプは現在の時刻より大きくなります。 – techspider

答えて

5

は、独自にちょうどその表現考えてみましょう:

select DATEADD(day,-31, GETDATE()) 
2016-07-22 16:18:42.697 

そして、あなたはその日時よりtest_date大きいと行を探してください。

はおそらく、あなたは日、時間部分を排除してのみ検討する必要があります:2016-07-22 10:15:00.420よう

select DATEADD(day,-31, cast(GETDATE() as date)) 
2016-07-22 

および日時が発見されます。

4

GETDATE()には日付だけでなく、実行時のタイムスタンプが付いています。例えば

SELECT GETDATE() 

戻り

2016年8月22日10:21:36.867

あなたはDATEADD(day,-31, GETDATE())-31を追加するときに、それがあなたのtest_dateを比較以上であること

2016-07-22 10:21:36。867

比較するために、より適切な方法だけで説明する日程:あなただけの日付部分

を取得することになる日

CONVERT(date, DATEADD(day,-31, GETDATE())) 

の数に関する具体的にする必要がある場合

2016-07-22

あなたがそう暦月で

CONVERT(date, DATEADD(MONTH,-1, GETDATE())) 

を比較する必要がある場合は、最終的にはあなたがGETDATE()の詳細については

SELECT 
    test_id, 
    lat, 
    long 
FROM testDB.src.test_20 
WHERE test_date >= CONVERT(date, DATEADD(DAY, -31, GETDATE())) 
AND lat IS NOT NULL 
AND long IS NOT NULL 

としてクエリを書くべきである、あなたはthis MSDN articleで見ることができます。

関連する問題