SQL - сравнение параметра даты с датой и временем - PullRequest
1 голос
/ 10 марта 2012

В таблице SQL Server у меня есть поле с именем Timestamp, которое является полем «datetime». На экране, который я создал, пользователь передаст дату (без времени), и мне нужно вернуть все записи за эту дату.

Просто сделать отметку времени = @Date, похоже, не сработает, если время в поле не 00:00:00. Какой самый эффективный способ сделать это?

Ответы [ 3 ]

6 голосов
/ 10 марта 2012

Поскольку вы работаете с SQL Server 2008, вы можете использовать тип данных DATE.

Сделать сравнение между

 CAST(Timestamp AS DATE) = @Date

Это должно работать и смотреть только на дату -нет времени.

2 голосов
/ 10 марта 2012

Как правило, вы должны думать о данных за конкретную дату как о данных, попадающих в диапазон, а не в какой-то момент времени. Поэтому в идеале ваш запрос должен использовать диапазон, например:

WHERE [Timestamp] >= @Date
AND [Timestamp] < DATEADD(DAY, 1, @Date)

В этом случае, к счастью, оптимизатор умный и все равно будет использовать индекс, если вы используете CONVERT(DATE, [timestamp]) против столбца. Однако во многих случаях вы должны быть осторожны, потому что это часто делает ваше предложение неискусным.

PS Timestamp - это ужасное название столбца. Это тип данных в SQL Server, который не имеет ничего общего с датой или временем.

0 голосов
/ 10 марта 2012

Обычный метод обрезания временной части от значения даты и времени состоит в использовании функций DATEDIFF и DATEADD .В вашем примере это будет использоваться для обрезания временной части поля Timestamp.

WHERE @DateEntered = DATEADD(DAY,0, DATEDIFF(DAY, 0, Timestamp))

По сути, он принимает значение datetime и находит название дней, начиная с даты, представленной 0 (дляотсутствие лучшего описания), а затем добавить это количество дней назад.Это эффективно сокращает часть времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...