Ich habe seit 5 Jahren auf eine elegantere Lösung gewartet, aber da einer noch nicht aufgetaucht ist, werde ich das posten, was ich bisher benutzt habe ...
CREATE FUNCTION [dbo].[UDTToLocalTime](@UDT AS DATETIME)
RETURNS DATETIME
AS
BEGIN
--====================================================
--Set the Timezone Offset (NOT During DST [Daylight Saving Time])
--====================================================
DECLARE @Offset AS SMALLINT
SET @Offset = -5
--====================================================
--Figure out the Offset Datetime
--====================================================
DECLARE @LocalDate AS DATETIME
SET @LocalDate = DATEADD(hh, @Offset, @UDT)
--====================================================
--Figure out the DST Offset for the UDT Datetime
--====================================================
DECLARE @DaylightSavingOffset AS SMALLINT
DECLARE @Year as SMALLINT
DECLARE @DSTStartDate AS DATETIME
DECLARE @DSTEndDate AS DATETIME
--Get Year
SET @Year = YEAR(@LocalDate)
--Get First Possible DST StartDay
IF (@Year > 2006) SET @DSTStartDate = CAST(@Year AS CHAR(4)) + '-03-08 02:00:00'
ELSE SET @DSTStartDate = CAST(@Year AS CHAR(4)) + '-04-01 02:00:00'
--Get DST StartDate
WHILE (DATENAME(dw, @DSTStartDate) <> 'sunday') SET @DSTStartDate = DATEADD(day, 1,@DSTStartDate)
--Get First Possible DST EndDate
IF (@Year > 2006) SET @DSTEndDate = CAST(@Year AS CHAR(4)) + '-11-01 02:00:00'
ELSE SET @DSTEndDate = CAST(@Year AS CHAR(4)) + '-10-25 02:00:00'
--Get DST EndDate
WHILE (DATENAME(dw, @DSTEndDate) <> 'sunday') SET @DSTEndDate = DATEADD(day,1,@DSTEndDate)
--Get DaylightSavingOffset
SET @DaylightSavingOffset = CASE WHEN @LocalDate BETWEEN @DSTStartDate AND @DSTEndDate THEN 1 ELSE 0 END
--====================================================
--Finally add the DST Offset
--====================================================
RETURN DATEADD(hh, @DaylightSavingOffset, @LocalDate)
END
GO
Hinweise:
Dies ist für die nordamerikanischen Servern, die Beobachter Sommerzeit. Bitte ändern Sie die Variable @Offest auf die Zeitzone des Servers versetzt die SQL-Funktion ausgeführt wird (zwar nicht die Sommerzeit Beobachten) ...
--====================================================
--Set the Timezone Offset (NOT During DST [Daylight Saving Time])
--====================================================
DECLARE @Offset AS SMALLINT
SET @Offset = -5
Da die DST-Regeln aktualisieren, um sie ändern ...
--Get First Possible DST StartDay
IF (@Year > 2006) SET @DSTStartDate = CAST(@Year AS CHAR(4)) + '-03-08 02:00:00'
ELSE SET @DSTStartDate = CAST(@Year AS CHAR(4)) + '-04-01 02:00:00'
--Get DST StartDate
WHILE (DATENAME(dw, @DSTStartDate) <> 'sunday') SET @DSTStartDate = DATEADD(day, 1,@DSTStartDate)
--Get First Possible DST EndDate
IF (@Year > 2006) SET @DSTEndDate = CAST(@Year AS CHAR(4)) + '-11-01 02:00:00'
ELSE SET @DSTEndDate = CAST(@Year AS CHAR(4)) + '-10-25 02:00:00'
--Get DST EndDate
WHILE (DATENAME(dw, @DSTEndDate) <> 'sunday') SET @DSTEndDate = DATEADD(day,1,@DSTEndDate)
Cheers,
Danke, werde versuchen, dass ich Sie wissen lassen – Michel
herausgefunden, wie zu konvertieren UTC andere Zeitzonen, UND versucht, eine SqlCLR-Funktion zu implementieren. Die Kombination dieser Funktionen funktionierte jedoch nicht, da ich das TimeZoneInfo-Objekt zur Berechnung der Datumsunterschiede verwende und ich nicht auf die Assembly verweisen kann, in der sich die Klasse von meinem SqlProject befindet (es scheint, dass Sie nur auf eine Teilmenge der .net verweisen können) Framework) – Michel
OK - neugierig, warum Sie die TimeZoneInfo-Klasse benötigen, wenn Sie UTC in Local konvertieren müssen. Wenn Ihr SQL-Server so konfiguriert ist, dass er sich in _ihrer_ lokalen Zeitzone befindet (vereinbart - dies ist eine Einschränkung), wird Ihre C# -Funktion so etwas wie "return new SqlDateTime (utcDate.Value.toLocalTime());" . Sie müssen keine Zeitzone angeben. Habe ich falsch verstanden? –