Дата и время, в где пункт

Как я могу выбрать 20.12.2008 в where пункт sql?

Сервер является SQL-сервером 2005.

select * from tblErrorLog
where errorDate = '12/20/2008'
52
задан Kevin Panko 10 March 2015 в 11:27
поделиться

6 ответов

WHERE datetime_column >= '20081220 00:00:00.000'
  AND datetime_column < '20081221 00:00:00.000'
73
ответ дан 7 November 2019 в 09:10
поделиться
select * from tblErrorLog
where errorDate BETWEEN '12/20/2008' AND DATEADD(DAY, 1, '12/20/2008')
.
1
ответ дан 7 November 2019 в 09:10
поделиться

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

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

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

.
5
ответ дан 7 November 2019 в 09:10
поделиться

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

и так далее. Так как эти поля вычислены и УКАЗАНЫВАЮТСЯ, они всегда актуальны и всегда актуальны, а так как они включены в список, вы можете даже при необходимости проиндексировать их.

.
24
ответ дан 7 November 2019 в 09:10
поделиться

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

Предположим, что речь идет о 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)

7
ответ дан 7 November 2019 в 09:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: