Выберите из таблицы данный день - PullRequest
4 голосов
/ 17 апреля 2011

Итак, у меня есть таблица в SQL Server со столбцом datetime. Я хочу выбрать все из этой таблицы:

select * from dbo.tblMessages

но я хочу передать параметр datetime. Затем я хочу выбрать из таблицы все сообщения, которые имеют тот же day, что и столбец datetime в tblMessages, а не только сообщения, опубликованные за последние 24 часа и т. Д.

Как бы я это сделал?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 17 апреля 2011

Это должно использовать индекс MyDateTimeCol в tblMessages

  select * from dbo.tblMessages
  WHERE

  MyDateTimeCol >= DATEADD(day, DATEDIFF(day, 0, @Mydatetimeparameter), 0)
  AND
  MyDateTimeCol < DATEADD(day, DATEDIFF(day, 0, @Mydatetimeparameter), 1)

Любая функция, примененная к MyDateTimeCol, будет препятствовать правильному использованию индекса, включая DATEDIFF между этим и @ Mydatetime

1 голос
/ 18 апреля 2011

Поскольку вы работаете на SQL Server 2008, вы можете просто сделать

SELECT *
FROM tblMessages
WHERE CAST(message_date AS DATE) = CAST(@YourDateParameter AS DATE)

Это возможно.SQL Server добавит ComputeScalar к плану, который вызывает внутреннюю функцию GetRangeThroughConvert и получает начало и конец диапазона для поиска.

0 голосов
/ 18 апреля 2011

Если вам нужно сделать это много, и если вы используете SQL Server 2005 или новее, вы также можете сделать это:

  • добавить три вычисленных столбца для дня,месяц, год вашей даты и сохраните эти

    ALTER TABLE dbo.YourTable
      ADD DayPortion AS DAY(YourDateTimeColumn) PERSISTED
    -- do the same for MONTH(YourDateTimeColumn) and YEAR(YourDateTimeColumn)
    
  • поместите указатель на три столбца:

    CREATE NONCLUSTERED INDEX IX_DatePortions
      ON dbo.tblMessages(YearPortion, MonthPortion, DayPortion)
    
  • теперь выможно очень легко и быстро выполнять поиск по тем дням, месяцам, годам, и с помощью индекса ваш поиск будет очень быстрым и быстрымстолбцы - теперь вы можете просто вставить новые строки в таблицу - эти три столбца будут вычислены автоматически.

    Поскольку они сохранены и проиндексированы, вы также можете легко и очень эффективно выполнять поиск по этим столбцам.

    И благодаря этой гибкости вы также можете легко найти, например, все строки за данный месяц или год.

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