Datetime в где пункт - PullRequest
       35

Datetime в где пункт

49 голосов
/ 22 декабря 2009

Как мне выбрать 20.12.2008 в where предложении sql?

Сервер SQL Server 2005.

select * from tblErrorLog
where errorDate = '12/20/2008'

Ответы [ 6 ]

70 голосов
/ 22 декабря 2009
WHERE datetime_column >= '20081220 00:00:00.000'
  AND datetime_column < '20081221 00:00:00.000'
23 голосов
/ 22 декабря 2009

Прежде всего, я бы рекомендовал использовать стандартный формат ISO-8601 для даты / времени - он работает независимо от языка и региональных настроек на вашем SQL Server. ISO-8601 - это формат YYYYMMDD - без пробелов и тире - только данные:

select * from tblErrorLog
where errorDate = '20081220'

Во-вторых, вы должны знать, что SQL Server 2005 DATETIME всегда включает время. Если вы проверите точное совпадение только с частью даты, вы получите только те строки, которые соответствуют времени 0:00:00 - ничего больше.

Вы можете использовать любой из упомянутых запросов рекомендованного диапазона, или в SQL Server 2008 вы можете использовать DATE только дату или время, или вы можете проверить что-то вроде:

select * from tblErrorLog
where DAY(errorDate) = 20 AND MONTH(errorDate) = 12 AND YEAR(errorDate) = 2008

Какой из них лучше для вас.

Если вам нужно часто выполнять этот запрос, вы можете либо попытаться нормализовать DATETIME, включив в него только дату, либо добавить вычисляемые столбцы для ДНЯ, МЕСЯЦА и ГОДА:

ALTER TABLE tblErrorLog
   ADD ErrorDay AS DAY(ErrorDate) PERSISTED
ALTER TABLE tblErrorLog
   ADD ErrorMonth AS MONTH(ErrorDate) PERSISTED
ALTER TABLE tblErrorLog
   ADD ErrorYear AS YEAR(ErrorDate) PERSISTED

и тогда вы могли бы сделать запрос проще:

select * from tblErrorLog
where ErrorMonth = 5 AND ErrorYear = 2009

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

14 голосов
/ 22 декабря 2009

Вы не говорите, какую базу данных вы используете, но в MS SQL Server это будет

WHERE DateField = {d '2008-12-20'}

Если это поле метки времени, вам понадобится диапазон:

WHERE DateField BETWEEN {ts '2008-12-20 00:00:00'} AND {ts '2008-12-20 23:59:59'}
7 голосов
/ 22 декабря 2009

Предполагается, что мы говорим о SQL Server DateTime

Примечание: МЕЖДУ включает оба конца диапазона, поэтому технически этот шаблон будет неправильным:

errorDate BETWEEN '12/20/2008' AND '12/21/2008'

Мой предпочтительный метод для такого временного диапазона:

'20081220' <= errorDate AND errordate < '20081221'

Работает с общими индексами (сканирование диапазона, SARGable, без функций) и корректно отключается в полночь следующего дня, не полагаясь на временную гранулярность SQL Server (например, 23: 59: 59.997)

4 голосов
/ 22 декабря 2009

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

Select * from tblErrorLog where convert(date,errorDate,101) = '12/20/2008'

См. CAST и CONVERT для получения дополнительной информации

1 голос
/ 22 декабря 2009
select * from tblErrorLog
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...