2016-05-04 21 views
0

親愛なるDBの看護婦もう一度私は助けが必要です。DateTimeからオフセットを減算する(日付時刻からUTCに)

私は、次の表を持っていると私は私が狙う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 

結果に異なるローカル時間を有効にオフセット欄に情報を使用する必要があるが、この

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 
のようなものです

実際には、時刻をUTCで計算する必要があります。

たとえば、2016-05-03 11:25:26+0300のオフセットは、2016-05-03 08:25:26 UTCになる必要があります。

+0

なぜあなた+02ようがない0200として格納されたオフセット:00? –

+0

それはDBにそのようにロードされたファイルから来る – JONSY

+0

列のデータ型は何ですか? (私はdatetimeとvarcharを推測しています) –

答えて

0

これを試してみてください:私は看板や時間数と符号と分の数を取得するには、その後、CASTvarchar値を変更するために使用さLEFT + RIGHTを取得するためにLEFTを使用しました

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

私は私の説明ではっきりしていない可能性があります私は実際にUTCで時間を計算する必要があります。 -05-03 11:25:26 +0300オフセットが必要になる2016-05-03 08:25:26 UTC – JONSY

+0

@JONSY:私の答えを更新しました –

0

int値に、そしてそこからそれだけだ時間のためのシンプルな分DATEADDDATEADD

宣言サンプルテーブル

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

移入サンプルテーブル

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 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 

結果

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

別の方法:

;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 

出力:

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 
関連する問題