Comment puis-je convertir le timestamp UNIX (bigint) en DateTime dans SQL Server ?
Réponses
Trop de publicités?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.
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
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
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
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
- Réponses précédentes
- Plus de réponses