I have a DateTime varchar in this format: 2005-08-08T00:00:00+01:00.
EDIT Here's a summary answer, cobbled together from others input:
You can convert it to local time or to utc as follows:
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'
SELECT @d as Input, 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__::[+-]:'
Results:
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
In SQL Server 2008 you can use the datetimeoffset data type.
SELECT [Result] = CONVERT(datetimeoffset, '2005-08-08T00:01:00+01:00', 127)
Output:
Result
----------------------------------
2005-08-08 00:01:00.0000000 +01:00
In SQL Server 2005 and earlier you can compute the UTC date and offset:
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
Output:
LocalDate OffsetMinutes UtcDate
----------------------- ------------- -----------------------
2007-08-08 00:01:00.000 60 2007-08-07 23:01:00.000
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With