GETUTCDATE () - 2 vs DATEADD (d, -2, GETUTCDATE ())

13

Eu queria saber qual é a diferença entre os dois métodos a seguir:

 GETUTCDATE()-2  

e

  DATEADD(d,-2,GETUTCDATE())

Eu acho que usar DATEADDé a maneira correta, mas queria saber por que?

novato
fonte

Respostas:

14

Não há nenhuma diferença real, mas quando você começa a usar DATETIME2valores ou funções que retornam DATETIME2valores, você obtém erros.

SELECT SYSDATETIME() - 1 AS [Incompatible]

Msg 206, Nível 16, Estado 2, Linha 17 Tipo de operando confronto: datetime2 é incompatível com int

Para isso, é necessário usar as funções matemáticas da data.

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

Aaron Bertrand fala brevemente sobre esse assunto em sua série Bad Habits to Kick .

Erik Darling
fonte
8

Ao contrário do que afirma uma das outras respostas, as duas opções são oficialmente suportadas e documentadas pelo SQL Server: datetime - numbernão é um comportamento indefinido.

A grande vantagem de

DATEADD(d, -2, GETUTCDATE())

é o fato de ser auto-documentado : seu objetivo é imediatamente óbvio.

GETUTCDATE() - 2, por outro lado, conta com o leitor que conhece a definição da datetime - numberoperação. Sim, atualmente pode ser o T-SQL idiomático, mas o fato de isso não ser mais suportado datetime2implica que as gerações futuras de desenvolvedores do SQL Server talvez não estejam mais familiarizadas com ele.

Heinzi
fonte
É mais explicitamente indicado aqui: Arithmetic Operators (Transact-SQL) " O mais (+) e menos (-) Os operadores também podem ser usados para realizar operações aritméticas em datetime e smalldatetime valores. "
ypercubeᵀᴹ
@ ypercubeᵀᴹ: A primeira linha de - (Subtrair) (Transact-SQL) é ainda mais explícita na unidade (dias): "Subtrai dois números (um operador aritmético de subtração). Também pode subtrair um número, em dias, de uma data . "
Heinzi
sim, eu vi aquilo. E depois, que "Não pode ser usado com tipos de dados de data, hora, data e hora2 ou data e hora configuradas". Portanto, a "data" na primeira frase significa qualquer tipo de data / hora, exceto aqueles que são proibidos (portanto, apenas datetime e smalldatetime, basicamente os tipos de datetime que existiam antes da versão de 2008 (?) Que datefoi adicionada). Está um pouco bagunçado.
ypercubeᵀᴹ
Talvez isso seja outra coisa que você possa adicionar em sua resposta. O fato de esse operador não suportar os novos tipos sugere que ele foi mantido apenas por razões de compatibilidade com versões anteriores.
ypercubeᵀᴹ