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


13

Мені було цікаво, чим відрізняється наступні два методи:

 GETUTCDATE()-2  

і

  DATEADD(d,-2,GETUTCDATE())

Я здогадуюсь, що DATEADDце правильний спосіб, але було цікаво, чому?

Відповіді:


14

Тут немає різниці, але коли ви почнете використовувати DATETIME2значення або функції, які повертають DATETIME2значення, ви отримаєте помилки.

SELECT SYSDATETIME() - 1 AS [Incompatible]

Msg 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ᵀᴹ: Перший рядок - (Віднімання) (Transact-SQL) ще більш чітко виражає wrt одиницю (дні): "Віднімає два числа (оператор арифметичного віднімання). Також можна відняти число, в днях, від дати . "
Хайнці

так, я це бачив. А потім пізніше те, що "Неможливо використовувати дату, час, дату2 або типи зміщення дат." Таким чином, "дата" у першому реченні означає будь-який тип дати / часу, крім тих, що заборонено (тому лише дата і малі дати, в основному типи дат, що існували до dateдоданої версії 2008 (?) ). Це трохи безладно.
ypercubeᵀᴹ

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