Actualmente utilizo lo siguiente para obtener una fecha y hora local de una fecha y hora UTC:
SET @offset = DateDiff(minute, GetUTCDate(), GetDate())
SET @localDateTime = DateAdd(minute, @offset, @utcDateTime)
Mi problema es que si el horario de verano se produce entre GetUTCDate()
y @utcDateTime
, @localDateTime
termina siendo una hora libre.
¿Hay una manera fácil de convertir de utc a hora local para una fecha que no es la fecha actual?
Estoy usando SQL Server 2005
WITH PERMISSION_SET = UNSAFE
. Algunos entornos no lo permiten como AWS RDS. Y es, bueno, inseguro. Desafortunadamente, no existe una implementación completa de zona horaria .Net que se pueda usar sinunsafe
permiso. Mira aquí y aquí .Desarrollé y publiqué el proyecto T-SQL Toolbox en codeplex para ayudar a cualquiera que tenga problemas con el manejo de fecha y hora en Microsoft SQL Server. Es de código abierto y completamente gratuito.
Ofrece UDF de conversión de fecha y hora fáciles utilizando T-SQL simple (sin CLR) además de tablas de configuración precargadas listas para usar. Y tiene soporte completo DST (horario de verano).
Puede encontrar una lista de todas las zonas horarias admitidas en la tabla "DateTimeUtil.Timezone" (incluida en la base de datos de T-SQL Toolbox).
En su ejemplo, puede usar la siguiente muestra:
Esto devolverá el valor de fecha y hora local convertido.
Desafortunadamente, es compatible con SQL Server 2008 o posterior solo debido a los nuevos tipos de datos (DATE, TIME, DATETIME2). Pero como se proporciona el código fuente completo, puede ajustar fácilmente las tablas y las UDF reemplazándolas por DATETIME. No tengo un MSSQL 2005 disponible para probar, pero también debería funcionar con MSSQL 2005. En caso de preguntas, solo házmelo saber.
fuente
Siempre uso este comando TSQL.
Es muy simple y hace el trabajo.
fuente
Encontré esta respuesta en StackOverflow que proporciona una función definida por el usuario que parece traducir con precisión las fechas y horas
Lo único que necesita modificar es la
@offset
variable en la parte superior para establecerlo en el desplazamiento de la zona horaria del servidor SQL que ejecuta esta función. En mi caso, nuestro servidor SQL usa EST, que es GMT - 5No es perfecto y probablemente no funcionará en muchos casos, ya que tiene compensaciones de TZ de media hora o 15 minutos (para aquellos que recomendaría una función CLR como la recomendada por Kevin ), sin embargo, funciona lo suficientemente bien para la mayoría de las zonas horarias genéricas en el norte America.
fuente
Para SQL Server 2016+, puede usar AT TIME ZONE . Manejará automáticamente el horario de verano.
fuente
Hay un par de buenas respuestas a una pregunta similar en Stack Overflow. Terminé usando un enfoque T-SQL de la segunda respuesta de Bob Albright para limpiar un desastre causado por un consultor de conversión de datos.
Funcionó para casi todos nuestros datos, pero luego me di cuenta de que su algoritmo solo funciona para fechas tan lejanas como el 5 de abril de 1987 , y teníamos algunas fechas de la década de 1940 que aún no se convertían correctamente. En última instancia, necesitábamos las
UTC
fechas en nuestra base de datos de SQL Server para alinearnos con un algoritmo en un programa de terceros que utilizaba la API de Java para convertirUTC
a la hora local.Me gusta el
CLR
ejemplo en la respuesta anterior de Kevin Feasel usando el ejemplo de Harsh Chawla, y también me gustaría compararlo con una solución que usa Java, ya que nuestro front end usa Java para hacer laUTC
conversión a la hora local.Wikipedia menciona 8 enmiendas constitucionales diferentes que involucran ajustes de zona horaria antes de 1987, y muchas de ellas están muy localizadas en diferentes estados, por lo que existe la posibilidad de que el CLR y Java puedan interpretarlas de manera diferente. ¿Su código de aplicación front-end utiliza dotnet o Java, o las fechas anteriores a 1987 son un problema para usted?
fuente
Puede hacerlo fácilmente con un procedimiento almacenado CLR.
Puede almacenar las zonas horarias disponibles en una tabla:
Y este procedimiento almacenado llenará la tabla con las zonas horarias posibles en su servidor.
fuente
WITH PERMISSION_SET = UNSAFE
. Algunos entornos no lo permiten como AWS RDS. Y es, bueno, inseguro. Desafortunadamente, no existe una implementación completa de zona horaria .Net que se pueda usar sinunsafe
permiso. Mira aquí y aquí .SQL Server versión 2016 resolverá este problema de una vez por todas . Para versiones anteriores, una solución CLR es probablemente la más fácil. O para una regla DST específica (como solo EE. UU.), Una función T-SQL puede ser relativamente simple.
Sin embargo, creo que una solución genérica de T-SQL podría ser posible. Mientras
xp_regread
funcione, intente esto:Una función T-SQL (compleja) podría usar estos datos para determinar el desplazamiento exacto de todas las fechas durante la regla DST actual.
fuente
fuente
Aquí hay una respuesta escrita para una aplicación específica del Reino Unido y basada exclusivamente en SELECT.
No aplicable entre la medianoche y la 1 a.m. del día en que comienza el horario de verano. Esto podría corregirse, pero la aplicación para la que fue escrita no lo requiere.
fuente