Прежде всего, я бы рекомендовал использовать стандартный формат 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, они всегда актуальны и всегда актуальны, и, поскольку они существуют, вы можете даже проиндексировать их при необходимости.