2016-05-04 24 views
0

Liebe DB-Gurus, ich brauche wieder Hilfe.Offset von DateTime subtrahieren (Datumszeit bis UTC)

Ich habe die folgende Tabelle und ich brauche die Informationen in der Spalte Offset verwenden, um die verschiedenen lokalen Zeiten GMT zu drehen

Order Time   Offset 
2016-05-03 10:08:22 +0200 
2016-05-03 10:08:22 +0300 
2016-05-03 13:11:26 +0200 
2016-05-03 11:07:27 +0200 
2016-05-03 14:22:35 +0200 
2016-05-03 16:31:36 +0300 

das Ergebnis, das ich zielen darauf ist so etwas wie dieses

Order Time   
2016-05-03 08:08:22 
2016-05-03 07:08:22 
2016-05-03 11:11:26 
2016-05-03 09:07:27 
2016-05-03 12:22:35 
2016-05-03 13:31:36 

Eigentlich muss ich die Zeit nach UTC berechnen.

Zum Beispiel 2016-05-03 11:25:26 mit +0300 Offset muss 2016-05-03 08:25:26 UTC werden.

+0

warum Ihre Offset als 0200 und nicht als +02 gespeichert ist: 00? –

+0

kommt es von einer Datei, die auf diese Weise in DB geladen wird – JONSY

+0

Was sind Datentypen der Spalten? (Ich rate Datetime und Varchar) –

Antwort

0

Versuchen Sie folgendes:

SELECT TODATETIMEOFFSET([Order Time], '-' + 
      substring(t.Offset, 2, len(t.Offset) - 2) + ':' + 
      substring(t.Offset, len(t.Offset) - 2, 2)) 
FROM yourtable t 
+0

Sorry kann sein, ich war nicht klar mit meiner Erklärung Ich brauche tatsächlich die Zeit von UTC berechnen. Zum Beispiel 2016 -05-03 11:25:26 mit +0300 Offset muss 2016-05-03 08:25:26 UTC werden – JONSY

+0

@JONSY: Ich habe meine Antwort aktualisiert –

0

ich LEFT verwendet habe das Zeichen und die Anzahl der Stunden zu erhalten und LEFT + RIGHT das Zeichen und die Anzahl der Minuten zu bekommen, dann verwendet CAST die varchar Werte geändert zu int Werten, und es ist nur ein einfaches DATEADD für Minuten und DATEADD stundenlang von dort:

Declare Probentisch

DECLARE @YourTable As Table 
(
    [Order Time] datetime, 
    Offset varchar(6) 
) 

Populate Probentisch

INSERT INTO @YourTable VALUES 
('2016-05-03 10:08:22', '+0200'), 
('2016-05-03 10:08:22', '+0300'), 
('2016-05-03 13:11:26', '-0200'), -- Note: - 2 hours 
('2016-05-03 11:07:27', '+0200'), 
('2016-05-03 14:22:35', '+0200'), 
('2016-05-03 16:31:36', '-0325') -- Note: - 3 hours 25 minutes 

Select

SELECT Offset, [Order Time], 
     DATEADD(HOUR, 
       -CAST(LEFT(Offset, LEN(Offset)-2) as int), 
       DATEADD(MINUTE, 
         -CAST(LEFT(Offset, 1) + RIGHT(Offset, 2) as int), 
         [Order Time]) 
       ) As [Order Time UTC] 
FROM @YourTable 

Ergebnisse

Offset Order Time     Order Time UTC 
------ -----------------------  ----------------------- 
+0200 2016-05-03 10:08:22.000  2016-05-03 08:08:22.000 
+0300 2016-05-03 10:08:22.000  2016-05-03 07:08:22.000 
-0200 2016-05-03 13:11:26.000  2016-05-03 15:11:26.000 -- Note: - 2 hours 
+0200 2016-05-03 11:07:27.000  2016-05-03 09:07:27.000 
+0200 2016-05-03 14:22:35.000  2016-05-03 12:22:35.000 
-0325 2016-05-03 16:31:36.000  2016-05-03 19:56:36.000 -- Note: - 3 hours and 25 minutes 
0

Eine andere Art und Weise:

;WITH cte AS (
SELECT * 
FROM (VALUES 
('2016-05-03 10:08:22', '+0200'), 
('2016-05-03 10:08:22', '+0300'), 
('2016-05-03 13:11:26', '+0200'), 
('2016-05-03 11:07:27', '+0200'), 
('2016-05-03 14:22:35', '+0200'), 
('2016-05-03 16:31:36', '+0300') 
) AS t([Order Time], Offset) 
) 

SELECT CAST(SWITCHOFFSET(TODATETIMEOFFSET([Order Time], STUFF(Offset,4,0,':')),'-00:00')as datetime) 
FROM cte 

Ausgang:

2016-05-03 08:08:22.000 
2016-05-03 07:08:22.000 
2016-05-03 11:11:26.000 
2016-05-03 09:07:27.000 
2016-05-03 12:22:35.000 
2016-05-03 13:31:36.000