Как запросить таблицу SQL Server на основе определенной даты - PullRequest
0 голосов
/ 26 декабря 2008

У меня есть таблица в SQL Server 2005, которая имеет три столбца:

id (int), 
message (text), 
timestamp (datetime)

Существует индекс для отметки времени и идентификатора.

Я заинтересован в выполнении запроса, который извлекает все сообщения за определенную дату, скажем, «12/20/2008». Однако я знаю, что простое выполнение, где timestamp = '12 / 20/2008 'не даст мне правильный результат, потому что это поле даты и времени.

Кто-то рекомендовал использовать функцию DATEPART и вытащить год, месяц и день из отметки времени и убедиться, что они равны 2008, 12 и 20 соответственно. Похоже, что это не будет использовать индекс, который у меня есть на отметке времени, и закончится полным сканированием таблицы.

Итак, каков наилучший способ построения моего запроса, чтобы я использовал созданный мной индекс?

Ответы [ 5 ]

2 голосов
/ 26 декабря 2008

Использование двух переменных даты и времени в моем опыте всегда работало безошибочно. Вопрос о резолюции кажется крайне маловероятным. Однако важно помнить, что диапазон (любого типа) включает в себя обе конечные точки. Таким образом, вы не можете проверить использование BETWEEN на две даты, потому что это будет включать оба. Скорее используйте что-то вроде

поле даты> = @startdate И поле даты <@ enddate </p>

Руководство.

C'mon люди - документация для этого не , что трудно найти : D

1 голос
/ 26 декабря 2008
-- avoid re-calculating @MyDate +1 for every row
DECLARE @NextDay DateTime
Set @NextDay = @MyDate + 1

SELECT 
    -- ...
WHERE [timestamp] >= @MyDate AND [timestamp] < @NextDay
0 голосов
/ 27 декабря 2008

Предполагая, что @Date является значением даты и времени для любого значения даты и времени в день, когда вы хотите получать все сообщения, используйте это

Where [timestamp] >= DateAdd(day, DateDiff(day, 0, @Date), 0) 
  And [timestamp] <  DateAdd(day, DateDiff(day, 0, @Date), 1) 

Это намного быстрее, чем использование CAST, не говоря уже о том, что при использовании CAST для datetime, если вы приведете значение datetime, которое после полудня к целому,

Declare @MyDate as Datetime
Set @MyDate = '12/25/2008 12:01:00'
Declare @IntVal Integer
Set @IntVal = Cast(@MyDate as Integer) 
Select Cast(@IntVal as DateTime)

округляется до целого числа, представляющего дату следующего дня. Приведенный выше скрипт выдаст 12/26/2008

0 голосов
/ 26 декабря 2008

МЕЖДУ НЕ делает> =, <. Это делает> =, <=, как доказывает этот код: </p>

declare @low datetime
declare @high datetime
set @low = getdate()
set @high = @low+1

select case when @low between @low and @high then 1 else 0 end, 
    case when @high between @low and @high then 1 else 0 end

Результат будет 1,1, показывая, что = применяется к обеим границам.

0 голосов
/ 26 декабря 2008

Заявление МЕЖДУ может помочь вам.

SELECT *
FROM MyTable
WHERE TimeStamp BETWEEN @Start AND @End;

Начало должно быть примерно в 12:01 для того дня, для которого вы хотите получать сообщения, а конец - в 23:59 для конца того же дня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...