5

2005-08-08T00:00:00+01:00 という形式の DateTime varchar があります。

  1. この形式に名前はありますか? (ISO8601ではありません。RFC3339ですか?)
  2. Transact-Sql を使用して DateTime に変換するにはどうすればよいですか?

編集 これは、他の入力からまとめた要約の回答です。

  1. これ、UTC からの時間オフセットを持つ ISO8601 です。UTC の場合、「+01:00」ではなく「Z」で終わります。 ウィキペディア
  2. 次のように、現地時間または utc に変換できます。

    DECLARE @d VARCHAR(25) SET @d = '2007-08-08T00:01:00+01:00' SET @d = '2007-08-08T00:01:00-01:00' SET @d = ' 2007-08-08T00:01:00+05:30'

    @d を入力として選択し、CONVERT(DATETIME, LEFT(@d, 19), 126) AS LocalDate , DATEADD(MINUTE , -CAST((SUBSTRING(@d, 20, 1) + RIGHT(@d, 2)) AS INT) , DATEADD(HOUR ,-CAST(SUBSTRING(@d, 20, 3) AS INT) , CONVERT(DATETIME, LEFT(@d, 19), 126))) as UtcDate WHERE @d LIKE ' _ - - _T__ : : [+-] : '

結果:

Input                     LocalDate               UtcDate
------------------------- ----------------------- -----------------------
2007-08-08T00:01:00+01:00 2007-08-08 00:01:00.000 2007-08-07 23:01:00.000

2007-08-08T00:01:00-01:00 2007-08-08 00:01:00.000 2007-08-08 01:01:00.000

2007-08-08T00:01:00+05:30 2007-08-08 00:01:00.000 2007-08-07 18:31:00.000
4

4 に答える 4

11

SQL Server 2008datetimeoffsetでは、データ型を使用できます。

SELECT [Result] = CONVERT(datetimeoffset, '2005-08-08T00:01:00+01:00', 127)

出力:

Result
----------------------------------
2005-08-08 00:01:00.0000000 +01:00

SQL Server 2005以前では、UTC の日付とオフセットを計算できます。

SELECT [LocalDate], [OffsetMinutes], [UtcDate]
FROM
(
    SELECT [IsoDate] = '2007-08-08T00:01:00+01:00'
) A
OUTER APPLY
(
    SELECT [LocalDate] = CONVERT(datetime, LEFT([IsoDate], 19), 126)
    , [OffsetMinutes] =
        CASE SUBSTRING([IsoDate], 20, 1)
            WHEN '+' THEN +1
            WHEN '-' THEN -1
        END
        * DATEDIFF(minute, 0,
            CAST(SUBSTRING([IsoDate], 21, 5) + ':00' AS datetime))
    WHERE [IsoDate] LIKE '____-__-__T__:__:__[+-]__:__'
) B
OUTER APPLY
(
    SELECT [UtcDate] = DATEADD(minute, -[OffsetMinutes], [LocalDate])
) C

出力:

LocalDate               OffsetMinutes UtcDate
----------------------- ------------- -----------------------
2007-08-08 00:01:00.000 60            2007-08-07 23:01:00.000
于 2012-04-24T15:17:07.743 に答える
2

タイムゾーン Z の ISO8601

使用する

SELECT CONVERT(datetime,'2005-08-08T00:00:00',126)

MSDNの説明を参照してください

編集:私はもともとtSqlがそれを受け入れると思っていた最後のゾーンと関係があると思いますが、そうではないことがわかりました.

于 2012-04-24T15:07:35.457 に答える
2

最初に日付を取得してから時間を取得し、オフセットを時間として追加するという、非常に醜い方法で行うことができます。

declare @d varchar(50)
set @d = '2005-08-08T00:00:00+01:00'

select Convert(datetime, left(@d, 10)) 
    + DateAdd(hour, Cast(substring(@d, 21, 2) as int), convert(datetime, substring(@d, 12, 8)))

または統合バージョン:

SELECT DateAdd(hour, Cast(substring(@d, 21, 2) as int), CONVERT(datetime, LEFT(@d, 19) ,127))

Final Result:
2005-08-08 01:00:00.000

オフセットが必要ない場合は、次のようにします。

declare @d varchar(50)
set @d = '2005-08-08T00:00:00+01:00'

select Convert(datetime, left(@d, 10)) 
    +  convert(datetime, substring(@d, 12, 8))

Result:
2005-08-08 00:00:00.000
于 2012-04-24T15:27:05.323 に答える