2012-03-09 3 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 имеет на это время, то вы можете преобразовать 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