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?

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 .


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.


É 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ᵀᴹ
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.