SQL преобразовать в GMT DateTime - PullRequest
       8

SQL преобразовать в GMT DateTime

2 голосов
/ 10 сентября 2009

Я не хочу конвертировать записи записей из dateTtime + OFFSET в dateTtimeZ напрямую

(2008-05-11T15: 30: 00 + 2 ---> 2008-05-11T13: 30: 00Z)

с функциями sql.

Не знаю, как это сделать: - (

Мне нужно реализовать это с помощью MySql, предпочитая не использовать хранимые процедуры

Thx

Ответы [ 6 ]

7 голосов
/ 20 ноября 2012

Попробуйте это

Для перевода из GMT в местное время:

select DATEADD(hour,DATEDIFF (hour, GETUTCDATE(), GETDATE()),MyGmtDateTime) as LocalDateTime

Для перевода из местного времени в GMT:

select DATEADD(hour,DATEDIFF (hour, GETDATE(), GETUTCDATE()),MyLocalDateTime) as GmtDateTime
1 голос
/ 10 сентября 2009

решение, скорее всего, будет зависеть от вашей РСУБД. В Oracle это будет работать:

SQL> SELECT to_timestamp_tz('2008-05-11T15:30:00+2',
  2                         'yyyy-mm-dd"T"hh24:mi:ssTZH')
  3         AT TIME ZONE 'GMT' gmt_time
  4    FROM dual;

GMT_TIME
----------------------------------
11/05/08 13:30:00,000000000 GMT
1 голос
/ 10 сентября 2009

Это не ясно из вашего вопроса, но я предполагаю, что у вас есть значения в виде строки. Если это так, то извлеките все, кроме смещения, как datetime, также получите смещение как datetime, а затем используйте знак для вычисления окончательного результата (T-SQL, 2005):

DECLARE @withOffset varchar(30);
SET @withOffset = '2008-05-11T15:30:00+2:00';
PRINT N'Original: ' + CAST(@withOffset AS nvarchar);

DECLARE @dt datetime;
SET @dt = CONVERT(datetime, LEFT(@withOffset, 19), 126);
PRINT N'dt=' + CONVERT(nvarchar, @dt, 127);

DECLARE @ofs datetime;
SET @ofs = CONVERT(datetime, SUBSTRING(@withOffset, 21, LEN(@withOffset) - 21), 108);
PRINT N'ofs=' + CAST(@ofs AS nvarchar);

IF (SUBSTRING(@withOffset, 19, 1) = '+')
BEGIN
    SET @dt = DATEADD(hour, DATEPART(hour, @ofs), @dt);
    SET @dt = DATEADD(minute, DATEPART(minute, @ofs), @dt);
END
ELSE
BEGIN
    SET @dt = DATEADD(hour, -DATEPART(hour, @ofs), @dt);
    SET @dt = DATEADD(minute, -DATEPART(minute, @ofs), @dt);
END;

PRINT N'dt=' + CONVERT(nvarchar, @dt, 127);
1 голос
/ 10 сентября 2009

Я довольно ржавый со своими встроенными функциями SQL, но в отсутствие какой-либо стандартной функции, вы могли бы написать хранимую процедуру для выполнения работы. Затем вы можете вызвать его как часть вашего оператора SELECT:

SELECT to_GMT(invoice_date) from INVOICES
1 голос
/ 10 сентября 2009

Если я правильно понял ваш вопрос, то невозможно найти часовой пояс по времени + смещение, потому что отображение не уникально. Несколько часовых поясов могут иметь одинаковое смещение.

Посмотрите на этот пример, где несколько часовых поясов имеют одинаковое смещение.

(GMT-06:00) Saskatchewan
(GMT-06:00) Guadalajara, Mexico City, Monterrey - Old
(GMT-06:00) Guadalajara, Mexico City, Monterrey - New
(GMT-06:00) Central Time (US & Canada)
(GMT-06:00) Central America

ДОБАВЛЕНО: Теперь я вижу, что вы просили что-то еще.

Хорошо, если смещение в ваших датах времени всегда одинаково, вы можете попробовать это преобразование.

DECLARE @DateTimeWithOffset datetimeoffset
DECLARE @JustDateTime datetime

SET @DateTimeWithOffset = '2008-05-11 15:30:00 + 02:00'

SELECT @DateTimeWithOffset = SWITCHOFFSET (@DateTimeWithOffset, '00:00')

SELECT @JustDateTime = CAST (@DateTimeWithOffset AS datetime)

Это чтобы дать вам идею. У меня нет SQL 2008 под рукой, поэтому я не проверял это. Может не работать.

0 голосов
/ 12 июня 2019

Используйте функцию SQL CONVERT_TZ(dt,from_tz,to_tz).

CONVERT_TZ () преобразует значение даты / времени dt из часового пояса, заданного from_tz в часовой пояс, заданный to_tz и возвращает результирующий значение.

Пример:

UPDATE this_table
SET this_table_date_gmt = (
    SELECT CONVERT_TZ(this_date, '+00:00', '-02:00')
)

Ссылка: https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_convert-tz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...