Добавить дату и время

Сервер: SQL Server 2012; SP1; Developer Edition

код:

declare @datetime datetime = '1900-01-01 00:00:00.000'

declare @time time = '11:11:11'

select @datetime + @time

Когда я запускаю вышеуказанный код в базе данных MASTER, я получаю сообщение об ошибке:

Msg 402, уровень 16, состояние 1, строка 3 Типы данных datetime и time несовместимы в операторе add.

Но когда это какая-то другая база данных, она работает! Любая идея, почему это должно происходить?

P.S. - В корпоративной редакции это вызывает ошибку, независимо от контекста базы данных.

Ответ 1

Вышеприведенный код будет работать с MS SqlServer 2008, но этот код не будет работать с MS SqlServer 2012 или выше. Я столкнулся с той же проблемой и решил ее так.

DECLARE @today_start datetime
DECLARE @dail_time time   

SELECT @today_start = convert(datetime, @dayStr,103) + CAST(@dail_time as DATETIME)

Ответ 2

На самом деле, нет никакого рационального поведения при добавлении даты и времени, , если, вы знаете временные интервалы для значений. Другие базы данных могут принимать произвольный часовой пояс по умолчанию, но SQL Server этого не делает.

Если бы дизайнеры T-SQL добавили такую ​​поддержку, большинство старых кодов (как на сервере, так и на стороне клиента) сломались бы с трудностью для обнаружения ошибок. Помните, что большинство людей по-прежнему используют старый тип даты и времени, предполагая определенный часовой пояс по умолчанию (локальный или GMT).

Можно утверждать, что добавление datetimeoffset и времени должно быть возможным, потому что первое содержит информацию о часовом поясе, а второе - нет, но я думаю, что разработчик T-SQL хотел избежать путаницы при преобразовании одного типа данных в другой. Многие клиентские коды будут по-прежнему прерываться, если люди не изменят код, соответствующий часовому поясу на клиентской стороне.

Итак, почему нет явной функции, которая делает добавление? Вероятно, это тоже не сработало, так как типы datetime без часового пояса преобразуются неявно в datetimeoffset2. Вы можете легко передать значение без временной зоны для такой функции, и оно преобразуется в неправильный часовой пояс, прежде чем он будет передан функции

Короче говоря, обратная совместимость не обеспечивает безопасную дату и дату добавления.