Почему SQL Server автоматически не преобразует дату в DATETIME для целей сравнения?

StackOverflow https://stackoverflow.com/questions/1701311

Вопрос

Мне нравится новый тип данных DATE в SQL Server 2008, но когда я сравниваю поле ДАТЫ с полем DATETIME на связанном сервере (в данном случае SQL 2005), вот так:

DECLARE @MyDate DATE
SET @MyDate = CONVERT(DATE, GETDATE())

SELECT *
  FROM MySQL2005LinkedServer.SomeDB.dbo.SomeTable
 WHERE SomeDatetimeField < @MyDate

Я получаю эту ошибку:

OLE DB provider "SQLNCLI10" returned message "Unspecified error".
OLE DB provider "SQLNCLI10" returned message "The scale is invalid.".

"Масштаб недопустим", очевидно, потому, что собственный клиент передает тип данных DATE обратно связанному серверу, и поскольку это SQL 2005, он не знает, что с ним делать.Выполнение этого же запроса к серверу 2008 работает просто отлично - SQL Server может сравнивать типы данных DATE и DATETIME без проблем.

Вот мой вопрос - есть ли причина, по которой собственный клиент автоматически не преобразует значение ДАТЫ '2009-11-09' в DATETIME '2009-11-09 00:00:00.000', чтобы предыдущая версия SQL Server не захлебнулась этим?

Это было полезно?

Решение

Внутренняя структура для datetime (2005) и date / time / datetime2 datetimeoffset (2008) сильно отличаются друг от друга, и, как и при других сравнениях, данные должны быть помещены в один и тот же тип при сравнении.Таким образом, собственный клиент был бы вынужден произвести такое преобразование.

Собственный клиент мог бы проявить щедрость и выполнить неявное преобразование за вас, но в равной степени "элемент наименьшего удивления", с которым, как правило, работают продукты, должен предполагать, что использование типа в SQL 2005, который он изначально не понимает, должно быть отклонено.Есть ряд тонких ошибок, которые наверняка могут проскользнуть из-за этого.

То же самое должно быть верно для ввода datetime2 (7) в SQL 2005, ожидаем ли мы, что он округлит точность в 100 нс обратно до 3,33 мс или выбросит и ошибка - я бы предпочел ошибку и сделал / принял явное приведение.

Другие советы

Я могу только догадываться, что это потому, что 2009-11-09 00:00:00.000 не зависит от часового пояса и может быть причиной более тонких ошибок.Пожалуйста, поправьте меня, если я ошибаюсь.

Вы можете достичь этого, используя ИЗМЕНИТЬ НАБОР СЕАНСОВ NLS_DATE_FORMAT = 'ММ / ДД /ГГГГ ЧЧ: MI: SS AM';Это временное решение, если вы работаете в UNIX, то эти настройки можно было бы выполнять постоянно в .profile .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top