Если вы можете потерять информацию о часовом поясе, вы можете просто удалить день недели и части часового пояса и преобразовать полученную строку в datetime
, используя простые CAST
или CONVERT
, например:
;
WITH StringDates (OldDateCol) AS (
SELECT 'Mon Nov 14 14:52:46 PST 2011' UNION ALL
SELECT 'Fri Nov 04 07:50:21 PDT 2011' UNION ALL
SELECT 'Thu Dec 01 00:00:00 PST 2011'
)
SELECT
OldDateCol,
NewDateCol = CAST(SUBSTRING(STUFF(OldDateCol, 21, 4, ''), 5, 99) AS datetime)
FROM StringDates
то есть STUFF
удаляет часть часового пояса, а SUBSTRING
пропускает день недели.
Вот набор результатов:
OldDateCol NewDateCol
---------------------------- -----------------------
Mon Nov 14 14:52:46 PST 2011 2011-11-14 14:52:46.000
Fri Nov 04 07:50:21 PDT 2011 2011-11-04 07:50:21.000
Thu Dec 01 00:00:00 PST 2011 2011-12-01 00:00:00.000
С другой стороны, если вы (или, возможно, в конечном итоге) используете столбец datetimeoffset
для хранения преобразованных значений и хотите сохранить бит информации о часовом поясе, вы можете попробовать следующий метод:
;
WITH StringDates (OldDateCol) AS (
SELECT 'Mon Nov 14 14:52:46 PST 2011' UNION ALL
SELECT 'Fri Nov 04 07:50:21 PDT 2011' UNION ALL
SELECT 'Thu Dec 01 00:00:00 PST 2011'
),
DatesAndTimeZones AS (
SELECT
OldDateCol,
NewDateCol = CAST(SUBSTRING(STUFF(OldDateCol, 21, 4, ''), 5, 99) AS datetime),
TimeZoneName = SUBSTRING(OldDateCol, 21, 4)
FROM StringDates
),
TimeZones (Name, Offset) AS (
SELECT 'PST', '-08:00' UNION ALL
SELECT 'PDT', '-07:00'
)
SELECT
d.OldDateCol,
NewDateTimeOffsetCol = TODATETIMEOFFSET(d.NewDateCol, t.Offset)
FROM DatesAndTimeZones d
INNER JOIN TimeZones t ON d.TimeZoneName = t.Name
Здесь преобразование выполняется в два этапа.
Первый шаг преобразует строки в значения datetime
, как и раньше, а также извлекает из них имена часовых поясов.
По сути, этих двух значений будет достаточно для преобразования datetime
в datetimeoffset
, но SQL Server не распознает часовой пояс имен , он может понимать только смещения , в виде +hh:mm
или -hh:mm
. Таким образом, вам необходимо заменить имена соответствующими смещениями, что можно сделать с помощью справочной таблицы (TimeZones
CTE выше играет свою роль).
Итак, следующий (и последний) шаг - присоединение к справочной таблице и вызов функции TODATETIMEOFFSET()
для получения окончательных результатов.
Вот результаты второго запроса:
OldDateCol NewDateTimeOffsetCol
---------------------------- ----------------------------------
Mon Nov 14 14:52:46 PST 2011 2011-11-14 14:52:46.000 -08:00
Fri Nov 04 07:50:21 PDT 2011 2011-11-04 07:50:21.000 -07:00
Thu Dec 01 00:00:00 PST 2011 2011-12-01 00:00:00.000 -08:00
Ссылки: