Aquí hay una función que funciona con datos históricos. Lo escribí para el horario de verano británico, que desafortunadamente ocurre el último domingo de los meses de marzo y octubre, haciendo la lógica un poco intrincada.
Básicamente, la parte de fecha codificada 01/03 está buscando el último domingo de marzo y 01/10 está buscando el último domingo de octubre (que es cuando los relojes avanzan y vuelven). NOTA: ¡SI SU SERVIDOR ESTÁ UTILIZANDO LAS FECHAS NATIVAS DE ESTADOS UNIDOS, REVERSE LAS DOS PUNTOS DE LA FECHA HASTA EL 03/01 Y EL 10/01!
Así que le das una fecha UTC y automáticamente se resuelve si una fecha histórica es BST o GMT. No es lo mejor para usar en un gran conjunto de datos, pero es una solución.
Ejecute este script para crear la función y llámelo en línea en su selección.SQL 2008 tiene un problema con las funciones definidas por el usuario, parece que pone una línea roja debajo del código, pero aún lo ejecuta siempre que use el prefijo dbo (SELECCIONE dbo.UTCConvert (su fecha) para ejecutarlo)
CREATE FUNCTION [dbo].[UTCConvert]
(
@p1 datetime
)
RETURNS datetime
AS
BEGIN
DECLARE @Result datetime
RETURN CASE
WHEN
@p1 >
(DATEADD(day,DATEDIFF(day,'19000107',DATEADD(month,DATEDIFF(MONTH,0,'01/03/' + CAST(DATEPART(year,@p1) as CHAR)),30))/7*7,'19000107'))
AND
@p1<
(DATEADD(day,DATEDIFF(day,'19000107',DATEADD(month,DATEDIFF(MONTH,0,'01/10/' + CAST(DATEPART(year,@p1) as CHAR)),30))/7*7,'19000107'))
THEN (DATEADD(HH, 1, @p1))
ELSE @p1
END
END
cambió la hora del servidor? ¿Puedes revisar? –
Umm, se ejecuta en SQL Azure. ¿Cómo verificaría? – slandau
¿no puedes simplemente hacer un "SELECCIONAR GETDATE() IR" y ver si coincide con lo que estás esperando? – Mat