2012-03-09 125 views
2

我有一個事件表,不斷更新,有一個日期時間列。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上有時間,那麼你可以轉換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

你可以嘗試這樣的事情的第一部分。

DateAdd機制的文檔頁面顯示所有你可以使用不同的日期部分(小時,天,秒等)

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