GETUTCDATE () - 2 против DATEADD (d, -2, GETUTCDATE ())


13

Мне было интересно, в чем разница между следующими двумя методами:

 GETUTCDATE()-2  

и

  DATEADD(d,-2,GETUTCDATE())

Я думаю, использование DATEADDявляется правильным способом, но было интересно, почему?

Ответы:


14

Там нет никакой разницы, но когда вы начнете использовать DATETIME2значения или функции, которые возвращают DATETIME2значения, вы получите ошибки.

SELECT SYSDATETIME() - 1 AS [Incompatible]

Сообщение 206, уровень 16, состояние 2, строка 17 Столкновение с типом операнда: datetime2 несовместимо с int

Для этого вы должны использовать математические функции даты.

SELECT DATEADD(DAY, -1, SYSDATETIME()) AS [Compatible]

Аарон Бертран вкратце рассказывает об этой проблеме в своей серии « Плохие привычки и удар ».


8

Вопреки утверждениям в одном из других ответов, оба варианта официально поддерживаются и документируются SQL Server: datetime - numberэто не неопределенное поведение.

Большое преимущество

DATEADD(d, -2, GETUTCDATE())

является фактом, что это самодокументирование : его цель немедленно очевидна.

GETUTCDATE() - 2с другой стороны, полагается, что читатель знает определение datetime - numberоперации. Да, в настоящее время это может быть идиоматический T-SQL, но тот факт, что он больше не поддерживается, datetime2подразумевает, что будущие поколения разработчиков SQL Server могут больше не знакомы с ним.


Здесь более четко указано: арифметические операторы (Transact-SQL) « Операторы плюс (+) и минус (-) могут также использоваться для выполнения арифметических операций со значениями datetime и smalldatetime . »
ypercubeᵀᴹ

@ ypercubeᵀᴹ: Первая строка - (Subtract) (Transact-SQL) еще более явная по отношению к единице (days): «Вычитает два числа (арифметический оператор вычитания). Может также вычесть число в днях из даты . "
Хайнци

да, я видел это А затем позже, что «Не может использоваться с типами данных date, time, datetime2 или datetimeoffset». Таким образом, «дата» в первом предложении означает любой тип даты / времени, за исключением тех, которые запрещены (например, только datetime и smalldatetime, в основном типы datetime, существовавшие до версии 2008 (?), Которая dateбыла добавлена). Это немного грязно.
ypercubeᵀᴹ

Возможно, это еще одна вещь, которую вы можете добавить в своем ответе. Тот факт, что этот оператор не поддерживает новые типы, предполагает, что он был сохранен только по причинам обратной совместимости.
ypercubeᵀᴹ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.