Как выбрать 12/20/2008 в разделе where
sql?
Сервер SQL Server 2005.
select * from tblErrorLog
where errorDate = '12/20/2008'
Как выбрать 12/20/2008 в разделе where
sql?
Сервер SQL Server 2005.
select * from tblErrorLog
where errorDate = '12/20/2008'
WHERE datetime_column >= '20081220 00:00:00.000'
AND datetime_column < '20081221 00:00:00.000'
Прежде всего, я бы рекомендовал использовать стандартный формат 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, они всегда актуальны и всегда актуальны, и поскольку они перечеркнуты, вы можете даже индексировать их, если это необходимо.
Вы не говорите, какую базу данных вы используете, но в 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'}
Предполагая, что мы говорим о 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)
Используйте функцию преобразования, чтобы получить все записи за определенный день.
Select * from tblErrorLog where convert(date,errorDate,101) = '12/20/2008'
Подробнее о CAST и CONVERT для получения дополнительной информации
select * from tblErrorLog
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')