2016-05-04 1 views
0

Chers gourous de DB encore une fois j'ai besoin d'aide.soustrayez offset de DateTime (date et heure UTC)

Je le tableau ci-dessous et je dois utiliser les informations contenues dans la colonne de décalage pour transformer les heures locales différentes à l'heure GMT

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 

le résultat que je vise est quelque chose comme ça

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 

En fait, j'ai besoin de calculer l'heure en UTC.

Par exemple 2016-05-03 11:25:26 avec +0300 le décalage doit devenir 2016-05-03 08:25:26 UTC.

+0

pourquoi votre décalage est stocké sous forme de 0200 et pas comme +02: 00? –

+0

il vient d'un fichier qui est chargé de cette façon dans la base de données – JONSY

+0

quels sont les types de données des colonnes? (Je devine datetime et varchar) –

Répondre

0

Essayez ceci:

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

désolé peut être je n'étais pas clair avec mon explication j'ai besoin réellement de calculer l'heure par UTC .Par exemple 2016 -05-03 11:25:26 avec décalage de +0300 doit devenir 2016-05-03 08:25:26 UTC – JONSY

+0

@JONSY: J'ai mis à jour ma réponse –

0

Je l'ai utilisé LEFT pour obtenir le signe et le nombre d'heures et LEFT + RIGHT pour obtenir le signe et le nombre de minutes, puis utilisé à CAST changé les valeurs varchar à int valeurs, et à partir de là, il est juste un DATEADD simple minutes et DATEADD pendant des heures:

Declare table échantillon

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

échantillons Populate tableau

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 

Sélectionnez

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 

Résultats

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

Une autre façon:

;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 

Sortie:

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