No SQL Server, podemos usar o método a seguir para retornar uma data e hora com base em um determinado carimbo de data/hora do Unix.
O timestamp Unix (também conhecido como Unix Epoch time, Unix time ou POSIX time) é o número de segundos decorridos desde 00:00:00 de quinta-feira, 1 de janeiro de 1970, Coordinated Universal Time (UTC).
Exemplo
Aqui está um exemplo de conversão de um timestamp Unix em um valor de data/hora:
SELECT DATEADD(s, 1860935119, '1970-01-01');
Resultado:
2028-12-20 14:25:19.000
Nesse caso, o timestamp unix era 1860935119, que se traduzia em uma data e hora de 2028-12-20 14:25:19.000.
Data/hora atual
Aqui está um exemplo que usa o timestamp Unix com base na data/hora atual:
SELECT DATEADD(s, DATEDIFF(s, '1970-01-01', GETUTCDATE()), '1970-01-01');
Resultado:
2022-04-18 00:31:46.000
Lembre-se, isso é supérfluo, porque poderíamos ter feito o seguinte:
SELECT GETUTCDATE();
Carimbos de data e hora Unix maiores
Quando confrontado com um valor de carimbo de data/hora Unix maior, como o seguinte:
SELECT DATEADD(s, 1867914562715876900, '1970-01-01');
Podemos obter um erro de estouro como este:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
Isso porque o valor do carimbo de data/hora do Unix é maior do que um número inteiro pode conter. Este carimbo de data/hora Unix contém precisão de nanossegundos e tem muitos dígitos para um número inteiro.
Temos algumas opções para lidar com isso. Uma opção é reduzir a precisão:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(s, CONVERT(int, LEFT(@ts, 10)), '1970-01-01');
Resultado:
2029-03-11 09:09:22.000
Aqui, usamos o
LEFT()
função para retornar apenas os primeiros dez dígitos, bem como o CONVERT()
função para retornar um inteiro. Se não quisermos reduzir a precisão, podemos fazer algo assim:
DECLARE @ts bigint = 1867914562715876900;
SELECT DATEADD(
ns,
@ts % 1000000000,
DATEADD( s, @ts / 1000000000, CAST('1970-01-01' as datetime2(7)) )
);
Resultado:
2029-03-11 09:09:22.7158769