2012-03-09 21 views
2

私は常に更新されるイベントテーブルをdatetime列に持っています。TSQL日付条件

今日から始まるすべてのイベントと、翌日から8時間開始するイベントを取得したいと考えています。

観客は実際に夜中にイベントをチェックしないので、前日にリストアップするという考えです。

今日は私はDATEDIFF(day,eventdate,GETDATE())=0をやっていますが、どうすればいいのか分かりませんでした。私の場合はthe dateadd()です。私は行がないか、あまりにも多くを取得します。

ので、希望の結果は次のとおりです。

From 00:00 on March 9 to 8:00 on March 10.(例のみ)

答えて

7

があなたの列上の任意の計算をしないに優れています。代わりに間隔を計算し、その間隔内にある行をフェッチします。このようにして、テーブルスキャンを実行する代わりにeventdateのインデックスを使用することができます。

select SomeColumns 
from YourTable 
where eventdate >= dateadd(day, datediff(day, 0, getdate()), 0) and 
     eventdate < dateadd(hour, 32, dateadd(day, datediff(day, 0, getdate()), 0)) 
1

あなたのクエリをバインドするためにこれらを使用することができます...

DECLARE @Start DateTime = CONVERT(nvarchar(10), GetDate(), 121) 
DECLARE @End DateTime = DATEADD(Hour, +32, @Start) 

は、ここであなたはまた、それをこのように行うことができますテストスクリプト

CREATE TABLE #Temp (Column1 DateTime) 

INSERT INTO #Temp (column1) values (getdate()) -- it's 6pm now 
INSERT INTO #Temp (column1) values (dateadd(hour, -24, getdate())) --6pm yesterday - outside window 
INSERT INTO #Temp (column1) values (dateadd(hour, -12, getdate())) --6am today 
INSERT INTO #Temp (column1) values (dateadd(hour, -5, getdate())) -- 1pm today 
INSERT INTO #Temp (column1) values (dateadd(hour, +12, getdate())) -- 6am tomorrow - inside window 
INSERT INTO #Temp (column1) values (dateadd(hour, +17, getdate())) -- 11am tomorrow - outside window 

select * from #Temp 

DECLARE @Start DateTime = CONVERT(nvarchar(10), GetDate(), 121) 
DECLARE @End DateTime = DateAdd(Hour, +32, @Start) 

SELECT * FROM #Temp WHERE Column1 > @Start AND Column1 < @End 
1
SELECT 
    Column1, Column2 
FROM 
    TableName 
WHERE 
    DateColumm BETWEEN Convert(Date, GETDATE()) AND DateAdd(hh, 32, Convert(smalldatetime, Convert(Date, GETDATE()))) 
1

です:

select * 
from yourtable 
WHERE EventDate >= Convert(varchar(10), getdate(), 101) 
AND EventDate < CAST(Convert(varchar(10), DateAdd(d, 1, getdate()), 101) + ' 08:00 AM' as datetime) 

あなたはEVENTDATEがそれに時間を持っている場合次に、あなたはあなたのWHERE

select * 
from yourtable 
WHERE Convert(varchar(10), EventDate, 101) >= Convert(varchar(10), getdate(), 101) 
AND EventDate < CAST(Convert(varchar(10), DateAdd(d, 1, getdate()), 101) + ' 08:00 AM' as datetime) 
1

の最初の部分であなたはこのような何かを試すことができEVENTDATEを変換することができます。

DateAdd documentionページでは、使用できるすべての異なる日付部分(時間、日、秒、など)

DECLARE @StartTimeWindow DATETIME, @EndTimeWindow DATETIME 
SET @StartTimeWindow = DATEDIFF(DAY, 0, GETDATE()) 
SET @EndTimeWindow = DATEADD(HOUR, 32, @StartTimeWindow) 

SELECT * 
FROM EventTable 
WHERE EventDate >= @StartTimeWindow 
    AND EventDate <= @EndTimeWindow 
を示し