139 votes

Comment puis-je convertir un bigint (horodatage UNIX) en datetime dans SQL Server?

Comment puis-je convertir le timestamp UNIX (bigint) en DateTime dans SQL Server ?

395voto

Daniel Little Points 4451

Cela a fonctionné pour moi :

Sélectionner
    dateadd(S, [unixtime], '1970-01-01')
De [Table]

Au cas où quelqu'un se demande pourquoi 1970-01-01, C'est ce qu'on appelle le temps d'Epoch.

Voici une citation de Wikipedia :

Le nombre de secondes écoulées depuis 00:00:00 Temps universel coordonné (UTC), jeudi 1er janvier 1970, sans compter les secondes intercalaires.

Le problème de l'An 2038

De plus, la fonction DataAdd prend un int pour les secondes à ajouter. Donc, si vous essayez d'ajouter plus de 2147483647 secondes, vous obtiendrez une erreur de débordement arithmétique. Pour résoudre ce problème, vous pouvez diviser l'addition en deux appels à DateAdd, un pour les années et un pour les secondes restantes.

Déclarer @t comme bigint = 4147483645

Sélectionner (@t / @oneyear) -- Années à ajouter
Sélectionner (@t % @oneyear) -- Secondes restantes à ajouter

-- Obtenir la date à partir d'un horodatage @t
Déclarer @oneyear comme int = 31622400
Sélectionner DateAdd(SECONDE, @t % @oneyear, DateAdd(ANNÉE, @t / @oneyear, '1970-01-01'))

Cela vous permettra de convertir un horodatage qui représente une année supérieure à 2038.

63voto

cepix Points 476

Si quelqu'un obtient l'erreur suivante :

Arithmetic overflow error converting expression to data type int

en raison du fait que le timestamp UNIX est en bigint (au lieu de int), vous pouvez utiliser ceci :

SELECT DATEADD(S, CONVERT(int,LEFT(1462924862735870900, 10)), '1970-01-01')
FROM TABLE

Remplacez le timestamp codé en dur par votre colonne réelle avec le timestamp UNIX

Source: MSSQL bigint Unix Timestamp to Datetime with milliseconds

61voto

KM. Points 51800

Essayez :

CREATE FUNCTION dbo.fn_ConvertToDateTime (@Datetime BIGINT)
RETURNS DATETIME
AS
BEGIN
    DECLARE @LocalTimeOffset BIGINT
           ,@AdjustedLocalDatetime BIGINT;
    SET @LocalTimeOffset = DATEDIFF(second,GETDATE(),GETUTCDATE())
    SET @AdjustedLocalDatetime = @Datetime - @LocalTimeOffset
    RETURN (SELECT DATEADD(second,@AdjustedLocalDatetime, CAST('1970-01-01 00:00:00' AS datetime)))
END;
GO

30voto

SQLMenace Points 68670

Comme ceci

ajoutez le datetime Unix (epoch) à la date de base en secondes

cela fonctionnera pour le moment (2010-05-25 07:56:23.000)

 SELECT dateadd(s,1274756183,'19700101 05:00:00:000')

Si vous voulez aller à l'envers, jetez un œil à ceci http://wiki.lessthandot.com/index.php/Epoch_Date

13voto

Mohamad Hamouday Points 1002

Test this:

Serveur SQL:

SELECT dateadd(S, timestamp, '1970-01-01 00:00:00') 
     FROM 
your_table

Serveur MySql:

SELECT
  from_unixtime(timestamp) 
FROM 
  your_table

http://www.w3resource.com/mysql/date-and-time-functions/mysql-from_unixtime-function.php

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X