Как я могу выбрать 20.12.2008 в where
пункт sql?
Сервер является SQL-сервером 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'
select * from tblErrorLog
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')
. Используйте функцию преобразования, чтобы получить все записи за определенный день.
Select * from tblErrorLog where convert(date,errorDate,101) = '12/20/2008'
См. CAST и CONVERT для получения дополнительной информации
.Прежде всего, я бы порекомендовал использовать стандартный формат ISO-8601 для даты/времени - он работает независимо от языка и региональных настроек на вашем SQL-сервере. 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
и так далее. Так как эти поля вычислены и УКАЗАНЫВАЮТСЯ, они всегда актуальны и всегда актуальны, а так как они включены в список, вы можете даже при необходимости проиндексировать их.
.Вы не говорите, какую базу данных вы используете, но в 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 сервера (e. g. 23:59:59.997)