Como posso converter o carimbo de data / hora UNIX (bigint) em DateTime no SQL Server?
sql
sql-server
datetime
unix-timestamp
Salman
fonte
fonte
Isso funcionou para mim:
Caso alguém se pergunte por que 01/01/1970, isso é chamado de época .
Abaixo está uma citação da Wikipedia:
fonte
Se alguém obtiver o erro abaixo:
devido ao timestamp unix estar em bigint (em vez de int), você pode usar isto:
Substitua o carimbo de data / hora codificado para sua coluna real por carimbo de data / hora unix
Fonte: MSSQL bigint Unix Timestamp para Datetime com milissegundos
fonte
Como isso
adicione a data e hora Unix (época) à data base em segundos
isso vai conseguir por agora (2010-05-25 07: 56: 23.000)
Se você quiser voltar, dê uma olhada neste http://wiki.lessthandot.com/index.php/Epoch_Date
fonte
Isso vai resolver:
Em vez de! Precisão! use: ss, ms ou mcs de acordo com a precisão do timestamp. Bigint é capaz de manter a precisão de microssegundos.
fonte
Teste isso:
Servidor SQL:
Servidor MySql:
http://www.w3resource.com/mysql/date-and-time-functions/mysql-from_unixtime-function.php
fonte
Adicionar n segundos a
1970-01-01
fornecerá uma data UTC porque n , o carimbo de data / hora Unix, é o número de segundos decorridos desde 00:00:00 Hora Universal Coordenada (UTC), quinta-feira, 1 de janeiro de 1970 .No SQL Server 2016, você pode converter um fuso horário em outro usando
AT TIME ZONE
. Você só precisa saber o nome do fuso horário no formato padrão do Windows:Ou simplesmente:
Notas:
DATETIMEOFFSET
paraDATETIME
.fonte
Se o tempo estiver em milissegundos e for necessário preservá-los:
fonte
Este é um desenvolvimento do trabalho que Daniel Little fez para esta questão, mas levando em consideração o horário de verão (funciona para datas 01-01 1902 e superiores devido ao limite interno na função de adição de dados):
Primeiro, precisamos criar uma tabela que armazenará os intervalos de datas para o horário de verão (fonte: Histórico do tempo nos Estados Unidos ):
Agora criamos uma função para cada fuso horário americano. Isso supõe que o tempo unix está em milissegundos. Se estiver em segundos, remova / 1000 do código:
Pacífico
Oriental
Central
Montanha
Havaí
Arizona
Alasca
fonte
fonte
Eu tive que enfrentar esse problema também. Infelizmente, nenhuma das respostas (aqui e em dezenas de outras páginas) foi satisfatória para mim, já que ainda não consigo chegar a datas além do ano 2038 devido a conversões de inteiros de 32 bits em algum lugar.
Uma solução que funcionou para mim no final foi usar
float
variáveis, para que eu pudesse ter pelo menos uma data máxima de2262-04-11T23:47:16.854775849
. Ainda assim, isso não cobre todo odatetime
domínio, mas é suficiente para minhas necessidades e pode ajudar outras pessoas que tenham o mesmo problema.Existem alguns pontos a serem considerados:
@ticksofday
a primeira linha do algoritmo de acordo.1900-01-01
é a data de origem dedatetime2
, assim como é a época1970-01-01
para carimbos de data / hora unix.float
s me ajudaram a resolver o problema do ano 2038 e estouros de inteiros e outros, mas tenha em mente que os números de ponto flutuante não têm muito desempenho e podem retardar o processamento de uma grande quantidade de carimbos de data / hora. Além disso, flutuações podem levar à perda de precisão devido a erros de arredondamento, como você pode ver na comparação dos resultados de exemplo para a data máxima acima (aqui, o erro é de cerca de 1,4425 ms).datetime
. Infelizmente, não há conversão explícita de valores numéricos emdatetime2
permitidos, mas é permitido converter numéricos paradatetime
explicitamente e isso, por sua vez, é convertido implicitamente paradatetime2
. Isso pode estar correto, por enquanto, mas pode mudar em versões futuras do SQL Server: Haverá umadateadd_big()
função ou a conversão explícita dedatetime2
será permitida ou a conversão explícita dedatetime
será proibida, então isso pode falhar ou pode ocorrer uma maneira mais fácil algum dia.fonte
Para GMT, esta é a maneira mais fácil:
fonte
Melhor? Esta função converte unixtime em milissegundos em datetime. Perdeu milissegundos, mas ainda é muito útil para filtrar.
fonte
A solução pode ser a seguinte:
fonte
@DanielLittle tem a resposta mais fácil e elegante para a pergunta específica. No entanto, se você estiver interessado em converter para um fuso horário específico E levando em consideração o DST (horário de verão), o seguinte funciona bem:
Observação: esta solução só funciona no SQL Server 2016 e superior (e no Azure).
Para criar uma função:
Você pode chamar a função assim:
fonte