Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como converter um carimbo de data/hora Unix em um valor de data/hora no SQL Server


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