我有一個事件表,不斷更新,有一個日期時間列。TSQL日期條件
我想要獲得今天開始的所有活動以及第二天開始8小時的活動。
這個想法是人們並不真正在半夜檢查事件,所以我們在前一天列出它們。
要得到今天的我做DATEDIFF(day,eventdate,GETDATE())=0
但我還沒有想出如何爲我的情況做the dateadd()
。我得到沒有行或太多。
所以想要的結果是:
From 00:00 on March 9 to 8:00 on March 10.
(只是舉例)
我有一個事件表,不斷更新,有一個日期時間列。TSQL日期條件
我想要獲得今天開始的所有活動以及第二天開始8小時的活動。
這個想法是人們並不真正在半夜檢查事件,所以我們在前一天列出它們。
要得到今天的我做DATEDIFF(day,eventdate,GETDATE())=0
但我還沒有想出如何爲我的情況做the dateadd()
。我得到沒有行或太多。
所以想要的結果是:
From 00:00 on March 9 to 8:00 on March 10.
(只是舉例)
這是更好地不做你列的任何計算。相反,計算間隔並獲取間隔中的行。這樣,您可以使用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))
您可以使用這些約束來查詢...
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
SELECT
Column1, Column2
FROM
TableName
WHERE
DateColumm BETWEEN Convert(Date, GETDATE()) AND DateAdd(hh, 32, Convert(smalldatetime, Convert(Date, GETDATE())))
你也可以這樣來做:
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)
你可以嘗試這樣的事情的第一部分。
的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