Estoy haciendo algunas consultas de selección SQL y me gustaría convertir mi columna de fecha y hora UTC en hora local para que se muestre como hora local en los resultados de mi consulta. Tenga en cuenta que NO estoy buscando hacer esta conversión a través del código, sino más bien cuando estoy haciendo consultas SQL manuales y aleatorias en mis bases de datos.
sql
sql-server
Nugs
fuente
fuente
Respuestas:
Puede hacer esto de la siguiente manera en SQL Server 2008 o superior:
También puedes hacer lo menos detallado:
Hagas lo que hagas, no lo utilices
-
para restar fechas, porque la operación no es atómica, y en ocasiones obtendrás resultados indeterminados debido a que las condiciones de carrera entre la fecha y hora del sistema se verifican en diferentes momentos (es decir, no atómicamente) .Tenga en cuenta que esta respuesta no tiene en cuenta el horario de verano. Si desea incluir un ajuste DST, consulte también la siguiente pregunta SO:
Cómo crear la función de inicio y finalización del horario de verano en SQL Server
fuente
No encontré ninguno de estos ejemplos útiles para obtener una fecha y hora almacenada como UTC en una fecha y hora en una zona horaria específica (NO la zona horaria del servidor porque las bases de datos SQL de Azure se ejecutan como UTC). Así es como lo manejé. No es elegante, pero es simple y le da la respuesta correcta sin mantener otras tablas:
fuente
AT TIME ZONE
sintaxis, considere stackoverflow.com/a/44941536/112764 : puede encadenar varias conversiones juntas simplemente concatenando múltiplesat time zone <blah>
s.dateTimeField AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time'
simplemente encadenando lasAT TIME ZONE
declaraciones. (@NateJ mencionó esto arriba, ahora lo veo)Si su fecha local es la hora
Eastern Standard Time
y desea convertir UTC a eso, en Azure SQL y SQL Server 2016 y superior, puede hacer lo siguiente:La lista completa de nombres de zonas horarias se puede encontrar con:
Y sí, las zonas horarias están mal nombradas, aunque lo es
Eastern Standard Time
, se tiene en cuenta el horario de verano.fuente
Si necesita una conversión que no sea la ubicación de su servidor, aquí hay una función que le permite pasar una compensación estándar y cuentas para el horario de verano de los Estados Unidos:
fuente
Uso de nuevas oportunidades de SQL Server 2016:
Pero el procedimiento clr funciona 5 veces más rápido: '- (
Tenga en cuenta que Offset for one TimeZone puede cambiar a horario de invierno o verano. Por ejemplo
resultados:
No puede simplemente agregar desplazamiento constante.
fuente
Si habilitar CLR en su base de datos es una opción además de usar la zona horaria del servidor sql, se puede escribir en .Net con bastante facilidad.
Entra un valor de fecha y hora UTC y sale el valor de fecha y hora local relativo al servidor. Los valores nulos devuelven nulo.
fuente
No hay una manera simple de hacer esto de una manera correcta Y genérica.
En primer lugar, debe entenderse que el desplazamiento depende de la fecha en cuestión, la zona horaria y el horario de verano.
GetDate()-GetUTCDate
solo le da el desplazamiento hoy en el TZ del servidor, que no es relevante.Solo he visto dos soluciones de trabajo y he buscado mucho.
1) Una función SQL personalizada con un par de tablas de datos base, como zonas horarias y reglas DST por TZ. Trabajando pero no muy elegante. No puedo publicarlo porque no soy dueño del código.
EDITAR: Aquí hay un ejemplo de este método https://gist.github.com/drumsta/16b79cee6bc195cd89c8
2) Agregue un ensamblado .net a la base de datos, .Net puede hacer esto muy fácilmente. Esto funciona muy bien, pero la desventaja es que necesita configurar varios parámetros en el nivel del servidor y la configuración se rompe fácilmente, por ejemplo, si restaura la base de datos. Uso este método pero no puedo publicarlo ya que no soy dueño del código.
fuente
Ninguno de estos funcionó para mí, pero esto a continuación funcionó al 100%. Espero que esto pueda ayudar a otros que intentan convertirlo como yo.
fuente
declare @StandardOffset int = datediff (hh, GETUTCDATE(), GETDATE())
Aquí hay una versión que representa el horario de verano, la compensación UTC y no está bloqueado en un año en particular.
fuente
Encontré que la función de una función fuera demasiado lenta cuando hay muchos datos. Entonces lo hice uniéndome a una función de tabla que permitiría un cálculo de la diferencia horaria. Básicamente se trata de segmentos de fecha y hora con el desplazamiento de la hora. Un año serían 4 filas. Entonces la función de tabla
devolvería esta tabla:
Cuenta para el horario de verano. A continuación se muestra una muestra de cómo se utiliza y la publicación completa del blog está aquí .
fuente
fuente
La respuesta de Ron contiene un error. Utiliza las 2:00 AM hora local donde se requiere el equivalente UTC. No tengo suficientes puntos de reputación para comentar la respuesta de Ron, así que a continuación aparece una versión corregida:
fuente
La marca de tiempo de UNIX es simplemente el número de segundos entre una fecha particular y la época de Unix,
SELECT DATEDIFF (SEGUNDO, {d '1970-01-01'}, GETDATE ()) // Esto devolverá la marca de tiempo UNIX en el servidor SQL
puede crear una función para la hora local de fecha a la conversión UTC de Unix utilizando la función de compensación de país a la marca de tiempo de Unix en el servidor SQL
fuente
Es sencillo. Pruebe esto para Azure SQL Server:
Para el servidor SQL local:
fuente
Para los
@@Version
usuarios de Azure SQL y > = SQL Server 2016, a continuación se muestra una función simpleAT TIME ZONE
.Para conocer los tipos de valores que
@LocalTimeZone
puede tomar, vaya a este enlace o vaya aKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
fuente
Como advertencia, si va a utilizar lo siguiente (tenga en cuenta los milisegundos en lugar de los minutos):
Tenga en cuenta que la parte DATEDIFF no siempre devolverá el mismo número. Así que no lo use para comparar DateTimes a milisegundos.
fuente
Descubrí que esta función es más rápida que otras soluciones que usan una tabla o bucles separados. Es solo una declaración de caso básica. Dado que todos los meses entre abril y octubre tienen un desplazamiento de -4 horas (hora del este) solo necesitamos agregar algunas líneas de casos más para los días marginales. De lo contrario, el desplazamiento es de -5 horas.
Esto es específico para una conversión de UTC a hora del Este, pero se pueden agregar funciones de zona horaria adicionales según sea necesario.
fuente
Esto debería ser capaz de obtener la hora del servidor con DST
sysdatetimeoffset tiene en cuenta el horario de verano
fuente
Primera función: configurada para la zona horaria italiana (+1, +2), fechas de cambio: último domingo de marzo y octubre, devuelve la diferencia entre la zona horaria actual y la fecha y hora como parámetro.
El codigo es:
Entonces la función que convierte la fecha
fuente
- Obtener hora estándar india de utc
fuente
Esto se puede hacer sin una función. El código a continuación convertirá una hora UTC a la hora de la montaña que representa el horario de verano. Ajuste todos los números -6 y -7 a su zona horaria en consecuencia (es decir, para EST se ajustaría a -4 y -5 respectivamente)
fuente
Tienes que formatear la cadena y convertirla a la hora correcta. En este caso necesitaba tiempo zulú.
fuente
La mejor manera para Oracle:
Con fecha y hora codificadas:
Result:
2018-10-28 00:00
Con nombres de columna y tabla:
fuente
Tengo un código para realizar las horas UTC a Local y Local a UTC que permite la conversión usando un código como este
y
Las funciones pueden admitir todas o un subconjunto de zonas horarias en IANA / TZDB según lo proporciona NodaTime; consulte la lista completa en https://nodatime.org/TimeZones
Tenga en cuenta que mi caso de uso significa que solo necesito una ventana 'actual', lo que permite la conversión de tiempos dentro del rango de aproximadamente +/- 5 años a partir de ahora. Esto significa que el método que he usado probablemente no sea adecuado para usted si necesita un período de tiempo muy amplio, debido a la forma en que genera código para cada intervalo de zona horaria en un rango de fechas determinado.
El proyecto está en GitHub: https://github.com/elliveny/SQLServerTimeConversion
Esto genera código de función SQL según este ejemplo
fuente
Bueno, si almacena los datos como fecha UTC en la base de datos, puede hacer algo tan simple como
esto era siempre local desde el punto del servidor y no estás jugando con AT
TIME ZONE 'your time zone name'
, si tu base de datos se mueve a otra zona horaria como la instalación de un cliente, una zona horaria codificada podría morderte.fuente
En postgres esto funciona muy bien ... Dígale al servidor la hora a la que se guarda la hora, 'utc', y luego pídale que se convierta a una zona horaria específica, en este caso 'Brasil / Este'
Obtenga una lista completa de zonas horarias con la siguiente selección;
Ver detalles aquí.
https://popsql.com/learn-sql/postgresql/how-to-convert-utc-to-local-time-zone-in-postgresql
fuente
Aquí hay uno más simple que tiene en cuenta dst
fuente
SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, GETUTCDATE(), '20150101'), GETDATE())
. Actualmente estoy en CEST (UTC + 2), pero el horario de verano no estará vigente el día de Año Nuevo, por lo que la respuesta correcta para mí sería el 1 de enero de 2015 a las 01:00. Su respuesta, como la respuesta aceptada, devuelve el 1 de enero de 2015 a las 02:00.