Как SQL Server оценивает этот запрос с помощью значения smalldatetime? - PullRequest
0 голосов
/ 20 сентября 2018

Рассмотрим следующие демонстрационные запросы и результаты (обратите внимание, что единственное различие в двух запросах заключается в операторе сравнения в предложении WHERE):

enter image description here

Столбец LUpd_DateTime является типом данных smalldatetime.Поскольку тип данных smalldatetime фактически не содержит каких-либо секунд (округление происходит вверх или вниз до ближайшей минуты), единственное объяснение, которое я имею для двух приведенных ниже запросов, заключается в том, что SQL Server преобразует строку даты в тип smalldatetime и округляет в большую сторону.до ближайшей минуты, таким образом изменяя строку даты на «20.09.2008 00:00:00 AM».

Кто-нибудь может это подтвердить?

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

SQL Server преобразует строку даты в тип smalldatetime и округляет до ближайшей минуты, изменяя строку даты на «20.09.2008 00:00:00 AM».Кто-нибудь может это подтвердить?

Да.Для сравнения двух выражений SQL Server всегда преобразует оба выражения в общий тип данных.Какой тип данных выражения имеет нижний Преобразование типа данных преобразуется.«Строка даты» - это выражение типа varchar, которое имеет более низкий приоритет, чем smalldatetime.Таким образом, строка преобразуется в smalldatetime для сравнения.И вы можете убедиться, что преобразование округляется до ближайшего значения:

select cast( '2018-09-19 11:59:59' as smalldatetime)

output

2018-09-19 12:00:00
0 голосов
/ 20 сентября 2018

Это четко описано в документации .

Определяет дату, которая объединяется с временем суток.Время основано на 24-часовом дне, с секундами, всегда равными нулю (: 00) и без дробных секунд.

Если вы посмотрите на свои результаты, все будут 00 секунд.

0 голосов
/ 20 сентября 2018

Я думаю, что вы, возможно, опечатали свое объяснение?Вы утверждаете, что столбец - smalldatetime, но затем продолжаете говорить, что считаете, что запрос преобразует «строку даты в smalldatetime».Если то, что я сказал, верно, то простая проверка логики покажет ваше предположение, чтобы быть верным.Да, при преобразовании оно станет «20.09.2008 00:00:00».

DECLARE @dateField AS date
SET @dateField = '2018-09-20 06:23:00'
SELECT CONVERT(smalldatetime, @dateField)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...