TSQL Date условия - PullRequest
       1

TSQL Date условия

2 голосов
/ 09 марта 2012

У меня есть таблица событий, которая постоянно обновляется, со столбцом даты и времени.

Я хочу получить все события, которые начинаются сегодня, а также события, начинающиеся через 8 часов на следующий день.

Идея состоит в том, что люди действительно не проверяют среди ночи события, поэтому мы перечисляем их накануне.

Чтобы получить сегодня, я делаю DATEDIFF(day,eventdate,GETDATE())=0, но я не понял, как сделать the dateadd() для моего случая.Я либо не получаю ни строк, ни слишком много.

Итак, желаемый результат:

From 00:00 on March 9 to 8:00 on March 10. (только пример)

Ответы [ 5 ]

7 голосов
/ 09 марта 2012

Лучше , а не делать какие-либо вычисления для вашего столбца.Вместо этого рассчитайте интервал и извлеките строки, которые находятся в интервале.Таким образом, вы можете использовать индекс на 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 голос
/ 09 марта 2012

Вы можете попробовать что-то вроде этого.

На странице документации 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
1 голос
/ 09 марта 2012

Вы также можете сделать это следующим образом:

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 голос
/ 09 марта 2012
SELECT
    Column1, Column2
FROM
    TableName
WHERE
    DateColumm BETWEEN Convert(Date, GETDATE()) AND DateAdd(hh, 32, Convert(smalldatetime, Convert(Date, GETDATE())))
1 голос
/ 09 марта 2012

Вы можете использовать их для привязки вашего запроса ...

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...