No SQL Server existem regras para converter tipos de dados implicitamente.
Nesta página de documentação há uma tabela sobre quais conversões são possíveis.
Nesta página de documentação podemos ver o que é convertido em quê.
Quando converto implicitamente um número inteiro em data e hora, o intervalo assumido implicitamente é de 1 dia. Portanto, o seguinte retorna no mesmo horário amanhã:
select getdate() + 1
No entanto, pode-se argumentar que 1 deveria ser uma hora ou um minuto. Tentei encontrar na documentação onde está especificado que o intervalo para conversão implícita para datetime é sempre de 24 horas. Logo no início da documentação do datetime diz:
Define uma data combinada com uma hora do dia com segundos fracionários com base em um relógio de 24 horas.
Mas não acho que isso seja preciso e claro o suficiente para convencer alguém de que o número inteiro 1 representará imutavelmente 1 dia se for convertido implicitamente.
Então, há algum lugar onde a Microsoft deixe isso claro?
Em resposta à sua pergunta "O Int 1 é sempre convertido implicitamente em 1 dia?" : Não. É para
(small)datetime
, mas para tipos de dados modernos irá gerar um erro.Quanto ao motivo de durar
1
um dia, provavelmente é algo anterior ao SQL Server e provavelmente vem do Sybase (embora eu não tenha como confirmar isso). Por que1
foi escolhido como dia, não sei. Talvez seja porque outro aplicativo da época fez algo semelhante; O Excel faz o mesmo, por exemplo, mas seus números não se alinham (0
is1900-01-00
e1
is1900-01-01
, porém, depois desvia mais por tratar 1900 como tendo um ano bissexto, então hoje está45371
no SQL Server, mas45373
no Excel). Se não fosse por causa de algum outro aplicativo, provavelmente era arbitrário.Como você mencionou nos comentários, códigos semelhantes
GETDATE() + 1
podem facilmente ser vistos como ambíguos; o que é1
como umdatetime
? Um usuário poderia facilmente ser perdoado por esperar que fosse outra coisa (como um segundo, como nas épocas).Esse comportamento não está presente nos tipos de dados modernos de data e hora,
date
edatetime2
(datetimeoffset
etime
). Os tipos de dados não permitem conversões de valores numéricos para eles, explícitos ou implícitos. Se você tentasse adicionar1
essa data, receberia um erro:Na verdade, o melhor a fazer é ser explícito. Existe uma função para adicionar/subtrair períodos de tempo a um valor de data (e hora):
DATEADD
. A função funciona para todos os tipos de dados de data e hora ("novo" e "antigo"), e a sintaxe é muito explícita:Ninguém, agora, pode ser perdoado por pensar que o que foi dito acima está adicionando algo diferente de 1 dia ao valor atual da data e hora do sistema.
CURRENT_TIMESTAMP
é a função compatível com ANSI e retorna o mesmo valor que a função do SQL Server,GETDATE()
ambas derivadas do sistema operacional do computador no qual são executadas.CURRENT_TIMESTAMP
funciona com outros bancos de dados compatíveis com ANSI, masGETDATE()
não.A menos que eu precise de uma data UTC, eu uso o
CURRENT_TIMESTAMP
formulário, pois é realmente um carimbo de data/hora com data/hora - a menos que seja atribuído, por exemplo: Ambos funcionam, mas são apenas do tipo Data, não DateTimeNão é apenas um número inteiro, pois todos funcionam no SQL Server.
Eu sempre recomendo o uso do
DATEADD(DAY, 1, CURRENT_TIMESTAMP)
para maior clareza de propósito e porque isso também torna mais simples quando você também precisa de horasDATEADD(HOUR, 8, CURRENT_TIMESTAMP)
DATEADD(MINUTE, 1400, CURRENT_TIMESTAMP)
ou outros ajustes de data e hora;A resposta para sua pergunta é sim. Mas não confie nisso. Você também pode adicionar 6 horas com +0,25, pois é assim que é a representação interna no SQL Server. Parece que muita documentação foi limpa, mas vi documentos antigos especificando a representação interna.
Muitos anos atrás, lembro-me de ter abusado disso, lançando muitas datas para flutuar, calculando a média e retrocedendo para obter a data média. Mas não acho que faria isso hoje.
Uma ferramenta útil para explorar problemas de tipo de dados é
SQL_VARIANT_PROPERTY
:Se você combinar os dois em uma expressão :
Como você descobriu, as regras para precedência de tipo de dados e conversão de tipo de dados mostram que ocorrerá uma conversão implícita de
int
paradatetime
na expressão anterior. Uma conversão explícita para o tipo de dados de destino deve fornecer o mesmo resultado:De uma forma deliciosamente circular, isso é documentado como:
Resultados da expressão :
+ (Adição) :
Precedência do tipo de dados : a tabela mostra que
datetime
(6) é uma precedência maior queint
(16).O que deixa você de volta à conversão de tipo de dados .
Isso deve significar que os exemplos de código mostram o comportamento esperado e que
1
serão convertidos implicitamente para um dia como um arquivodatetime
. A documentação explícita nem sempre está disponível.Além: Outro lugar útil para verificar é Constants . Silencia sobre o assunto em questão.