¿Cómo puedo convertir la marca de tiempo de UNIX (bigint) a DateTime en SQL Server?
sql
sql-server
datetime
unix-timestamp
salman
fuente
fuente
Esto funcionó para mí:
En caso de que alguien se pregunte por qué 1970-01-01, esto se llama Época .
A continuación se muestra una cita de Wikipedia:
fuente
Si alguien recibe un error a continuación:
debido a que la marca de tiempo de Unix está en bigint (en lugar de int), puede usar esto:
Reemplace la marca de tiempo codificada para su columna real con unix-timestamp
Fuente: MSSQL bigint Unix Timestamp a Datetime con milisegundos
fuente
Me gusta esto
agregue la fecha y hora de Unix (época) a la fecha base en segundos
esto lo conseguirá por ahora (2010-05-25 07: 56: 23.000)
Si desea retroceder, eche un vistazo a este http://wiki.lessthandot.com/index.php/Epoch_Date
fuente
Esto lo hará:
En lugar de! Precisión! use: ss, ms o mcs según la precisión de la marca de tiempo. Bigint es capaz de mantener una precisión de microsegundos.
fuente
Prueba esto:
Servidor SQL:
Servidor MySql:
http://www.w3resource.com/mysql/date-and-time-functions/mysql-from_unixtime-function.php
fuente
Agregar n segundos a
1970-01-01
le dará una fecha UTC porque n , la marca de tiempo de Unix, es la cantidad de segundos que han transcurrido desde las 00:00:00 de la hora universal coordinada (UTC), el jueves 1 de enero de 1970 .En SQL Server 2016, puede convertir una zona horaria a otra usando
AT TIME ZONE
. Solo necesita saber el nombre de la zona horaria en formato estándar de Windows:O simplemente:
Notas:
DATETIMEOFFSET
aDATETIME
.fuente
Si el tiempo está en milisegundos y es necesario preservarlos:
fuente
Esto se basa en el trabajo que hizo Daniel Little para esta pregunta, pero teniendo en cuenta el horario de verano (funciona para las fechas 01-01 1902 y superiores debido al límite int en la función dateadd):
Primero necesitamos crear una tabla que almacene los rangos de fechas para el horario de verano (fuente: Historia del tiempo en los Estados Unidos ):
Ahora creamos una función para cada zona horaria estadounidense. Esto supone que el tiempo de Unix está en milisegundos. Si es en segundos, elimine el / 1000 del código:
Pacífico
Oriental
Central
Montaña
Hawai
Arizona
Alaska
fuente
fuente
Yo también tuve que enfrentarme a este problema. Desafortunadamente, ninguna de las respuestas (aquí y en docenas de otras páginas) ha sido satisfactoria para mí, ya que todavía no puedo alcanzar fechas más allá del año 2038 debido a conversiones de enteros de 32 bits en alguna parte.
Una solución que funcionó para mí al final fue usar
float
variables, por lo que podría tener al menos una fecha máxima de2262-04-11T23:47:16.854775849
. Aún así, esto no cubre todo eldatetime
dominio, pero es suficiente para mis necesidades y puede ayudar a otros a encontrar el mismo problema.Hay algunos puntos a considerar:
@ticksofday
y la primera línea del algoritmo en consecuencia.1900-01-01
es la fecha de origendatetime2
, al igual que la época1970-01-01
de las marcas de tiempo de Unix.float
s me ayudó a resolver el problema del año 2038 y los desbordamientos de enteros y demás, pero tenga en cuenta que los números de punto flotante no funcionan muy bien y pueden ralentizar el procesamiento de una gran cantidad de marcas de tiempo. Además, los flotadores pueden provocar una pérdida de precisión debido a errores de redondeo, como puede ver en la comparación de los resultados del ejemplo para la fecha máxima anterior (aquí, el error es de aproximadamente 1,4425 ms).datetime
. Desafortunadamente, no hay unadatetime2
conversióndatetime
explícita de valores numéricos a permitidos, pero está permitido convertir números a explícitamente y esto, a su vez, se convierte implícitamente endatetime2
. Esto puede ser correcto, por ahora, pero puede cambiar en futuras versiones de SQL Server: o habrá unadateadd_big()
función odatetime2
se permitirá la conversión explícita adatetime
, o la conversión explícita a no se permitirá, por lo que esto puede romperse o puede ocurrir. una forma más fácil algún día.fuente
Para GMT, esta es la forma más sencilla:
fuente
¿Mejor? Esta función convierte unixtime en milisegundos a datetime. Se han perdido milisegundos, pero sigue siendo muy útil para filtrar.
fuente
La solución puede ser la siguiente:
fuente
@DanielLittle tiene la respuesta más fácil y elegante a la pregunta específica. Sin embargo, si está interesado en realizar la conversión a una zona horaria específica Y teniendo en cuenta el horario de verano (DST), lo siguiente funciona bien:
Nota: esta solución solo funciona en SQL Server 2016 y versiones posteriores (y Azure).
Para crear una función:
Puedes llamar a la función así:
fuente