Comment puis-je convertir un horodatage UNIX (bigint) en DateTime dans SQL Server?
sql
sql-server
datetime
unix-timestamp
Salman
la source
la source
Cela a fonctionné pour moi:
Au cas où quelqu'un se demanderait pourquoi 1970-01-01, cela s'appelle le temps d'époque .
Voici une citation de Wikipedia:
la source
Si quelqu'un obtient une erreur ci-dessous:
en raison du fait que l'horodatage unix est en bigint (au lieu de int), vous pouvez utiliser ceci:
Remplacez l'horodatage codé en dur de votre colonne réelle par un horodatage unix
Source: MSSQL bigint Unix Timestamp à Datetime en millisecondes
la source
Comme ça
ajouter la date / heure Unix (epoch) à la date de base en secondes
cela l'aura pour le moment (2010-05-25 07: 56: 23.000)
Si vous voulez faire marche arrière, jetez un œil à ce http://wiki.lessthandot.com/index.php/Epoch_Date
la source
Cela le fera:
Au lieu de! Précision! utiliser: ss, ms ou mcs selon la précision de l'horodatage. Bigint est capable de maintenir une précision de l'ordre de la microseconde.
la source
Testez ceci:
Serveur SQL:
Serveur MySql:
http://www.w3resource.com/mysql/date-and-time-functions/mysql-from_unixtime-function.php
la source
Ajouter n secondes à
1970-01-01
vous donnera une date UTC car n , l'horodatage Unix, est le nombre de secondes qui se sont écoulées depuis 00:00:00 UTC (temps universel coordonné), jeudi 1er janvier 1970 .Dans SQL Server 2016, vous pouvez convertir un fuseau horaire en un autre à l'aide de
AT TIME ZONE
. Il vous suffit de connaître le nom du fuseau horaire au format standard Windows:Ou simplement:
Remarques:
DATETIMEOFFSET
surDATETIME
.la source
Si le temps est en millisecondes et qu'il faut les conserver:
la source
Ceci s'appuie sur le travail que Daniel Little a fait pour cette question, mais en tenant compte de l'heure d'été (fonctionne pour les dates 01-01 1902 et plus en raison de la limite int sur la fonction dateadd):
Nous devons d'abord créer un tableau qui stockera les plages de dates pour l'heure d'été (source: History of time aux États-Unis ):
Nous créons maintenant une fonction pour chaque fuseau horaire américain. Cela suppose que l'heure Unix est en millisecondes. Si c'est en secondes, supprimez le / 1000 du code:
Pacifique
Est
Central
Montagne
Hawaii
Arizona
Alaska
la source
la source
J'ai dû faire face à ce problème aussi. Malheureusement, aucune des réponses (ici et dans des dizaines d'autres pages) n'a été satisfaisante pour moi, car je ne peux toujours pas atteindre les dates au-delà de l'année 2038 en raison de cast entiers 32 bits quelque part.
Une solution qui a fonctionné pour moi à la fin a été d'utiliser des
float
variables, afin que je puisse avoir au moins une date maximale de2262-04-11T23:47:16.854775849
. Pourtant, cela ne couvre pas tout ledatetime
domaine, mais cela suffit à mes besoins et peut aider d'autres personnes rencontrant le même problème.Il y a quelques points à considérer:
@ticksofday
la première ligne de l'algorithme en conséquence.1900-01-01
est la date d'origine pourdatetime2
, tout comme l'époque1970-01-01
pour les horodatages Unix.float
s m'a aidé à résoudre le problème de l'année 2038 et les débordements d'entiers et autres, mais gardez à l'esprit que les nombres à virgule flottante ne sont pas très performants et peuvent ralentir le traitement d'un grand nombre d'horodatages. De plus, les flottants peuvent entraîner une perte de précision en raison d'erreurs d'arrondi, comme vous pouvez le voir dans la comparaison des résultats d'exemple pour la date maximale ci-dessus (ici, l'erreur est d'environ 1,4425 ms).datetime
. Malheureusement, il n'y a pas dedatetime2
conversiondatetime
explicite des valeurs numériques en valeurs autorisées, mais il est autorisé de convertir les valeurs numériques explicitement et cela, à son tour, est converti implicitement endatetime2
. Cela peut être correct, pour le moment, mais peut changer dans les versions futures de SQL Server: Soit il y aura unedateadd_big()
fonction, soit la conversion explicite endatetime2
sera autorisée ou la distribution explicite endatetime
sera interdite, donc cela peut être interrompu ou il peut arriver un moyen plus facile un jour.la source
Pour GMT, voici le moyen le plus simple:
la source
Mieux? Cette fonction convertit unixtime en millisecondes en datetime. Il a perdu des millisecondes, mais reste très utile pour le filtrage.
la source
La solution peut être la suivante:
la source
@DanielLittle a la réponse la plus simple et la plus élégante à la question spécifique. Cependant, si vous êtes intéressé par la conversion vers un fuseau horaire spécifique ET en tenant compte de l'heure d'été (heure d'été), ce qui suit fonctionne bien:
Remarque: cette solution fonctionne uniquement sur SQL Server 2016 et versions ultérieures (et Azure).
Pour créer une fonction:
Vous pouvez appeler la fonction comme ceci:
la source