Подтвердить что ты не робот

Datetime in where where

Как выбрать 12/20/2008 в разделе where sql?

Сервер SQL Server 2005.

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

Ответ 1

WHERE datetime_column >= '20081220 00:00:00.000'
  AND datetime_column < '20081221 00:00:00.000'

Ответ 2

Прежде всего, я бы рекомендовал использовать стандартный формат 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, чтобы включить только дату, либо добавить вычисленные столбцы для DAY, MONTH и YEAR:

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

Ответ 3

Вы не говорите, какую базу данных вы используете, но в 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'}

Ответ 4

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

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

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

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

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

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

Ответ 5

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

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

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

Ответ 6

select * from tblErrorLog
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')