Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Local time to UTC, туплю :(  [new]
abrashka
Member

Откуда:
Сообщений: 517
День добрый!
Нужно перевести даты из Local Time в UTC,
Как сделать наоборот(из UTC в Local) я разобрался, а вот как нужно- туплю :(

Наоборот:
SELECT 
	CONVERT(
				datetime, 
				SWITCHOFFSET(
								CONVERT(datetimeoffset, GETDATE()), 
								DATENAME(TzOffset, SYSDATETIMEOFFSET())
							)
			) 
AS LocalTime


Помогите плз.
23 сен 13, 10:30    [14871066]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
Glory
Member

Откуда:
Сообщений: 104760
GETDATE() - это уже local time сервера
23 сен 13, 10:37    [14871102]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
Glory
Member

Откуда:
Сообщений: 104760
GETUTCDATE()
Returns the current date of the system in UTC time (Universal Time Coordinate or Greenwich Mean Time) using a DT_DBTIMESTAMP format.
23 сен 13, 10:38    [14871105]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
abrashka
Member

Откуда:
Сообщений: 517
Glory,
Сорри, я для примера привел.

Более точный пример:
create table #t (id int identity(1,1),LocalTime datetime,UTCTime datetime) 
insert into #t (LocalTime)
select '2013-09-23 09:39:14.123' union
select '2013-09-08 05:12:18.454' union
select '2011-03-12 11:01:23.312' union
select '2012-11-15 21:17:35.013' 

Нужно проапдейтить UTCTime.

Спасибо!
23 сен 13, 10:44    [14871144]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
Glory
Member

Откуда:
Сообщений: 104760
abrashka
Нужно проапдейтить UTCTime.

Откуда сервер знает, для какой time zone время в приведенной таблице ?
23 сен 13, 10:46    [14871172]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
abrashka
Member

Откуда:
Сообщений: 517
Glory,

Речь идет о TimeZone сервера
23 сен 13, 10:47    [14871183]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
Glory
Member

Откуда:
Сообщений: 104760
Вы это хотите выислить ?
select datediff(hh, getutcdate(), getdate())
23 сен 13, 10:49    [14871195]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
abrashka
Member

Откуда:
Сообщений: 517
Например сейчас select GETDATE() выдает
'2013-09-23 09:49:45.480', сервер находится в таймзоне GMT+3, значит мне нужно получить:
'2013-09-23 06:49:45.480'

Ну соответственно в примере в первой строке, где '2013-09-23 09:39:14.123' в LocalTime, должно быть '2013-09-23 06:39:14.123' в поле UTCTime.
23 сен 13, 10:52    [14871230]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
getutcdate
Guest
abrashka
Glory,
Сорри, я для примера привел.

Более точный пример:
create table #t (id int identity(1,1),LocalTime datetime,UTCTime datetime) 
insert into #t (LocalTime)
select '2013-09-23 09:39:14.123' union
select '2013-09-08 05:12:18.454' union
select '2011-03-12 11:01:23.312' union
select '2012-11-15 21:17:35.013' 

Нужно проапдейтить UTCTime.

Спасибо!



текущую разницу м/у utc и local узнать не сложно

datediff(mi, getdate(), getutcdate())

и следовательно

utctime = dateadd(mi, datediff(mi, getdate(), getutcdate()), LocalTime)

но... есть(был) переход на зимнее/летнее время, и следовательно нужно знать какая разница во времени с UTC была на момент LocalTime, а эту информацию получить из функций tsql нельзя (для произвольной временной зоны). Более того, при переводе времени назад одному UTC времени соответствуют два local (до и после перевода).
23 сен 13, 10:55    [14871253]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ну так предложеный пример как раз вычисляет ращзницу в цасах между локальным временем и временем utc
23 сен 13, 10:56    [14871256]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
getutcdate
Guest
fix
getutcdate
...Более того, при переводе времени назад одному local времени соответствуют два UTC(до и после перевода).
23 сен 13, 11:00    [14871282]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
abrashka
Member

Откуда:
Сообщений: 517
Glory
Вы это хотите выислить ?
select datediff(hh, getutcdate(), getdate())

это я могу вычислить при помощи:
select DATENAME(TzOffset, SYSDATETIMEOFFSET())


Как вариант можно использовать:
select 
	id,
	LocalTime,
	dateadd(hh,-datediff(hh, getutcdate(), getdate()),LocalTime) as UTCTime
from #t

основываясь на Вашем примере, но думал, что есть более элегантное решение.
23 сен 13, 11:02    [14871296]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
Гость333
Member

Откуда:
Сообщений: 3683
abrashka
Как вариант можно использовать:
select 
	id,
	LocalTime,
	dateadd(hh,-datediff(hh, getutcdate(), getdate()),LocalTime) as UTCTime
from #t

Нельзя такое использовать, т.к. timezone не обязан равняться целым часам. Может быть, например, '+03:30'. Так что с учётом минут надо делать.
23 сен 13, 11:08    [14871335]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
Glory
Member

Откуда:
Сообщений: 104760
abrashka
но думал, что есть более элегантное решение.

Как менять части даты без написания кода что ли ?
23 сен 13, 11:08    [14871336]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
abrashka
Member

Откуда:
Сообщений: 517
Glory
abrashka
но думал, что есть более элегантное решение.

Как менять части даты без написания кода что ли ?


Нет :)
Как использовать SWITCHOFFSET и т.п. как я привел в первом примере, при переводе из UTC в Local
23 сен 13, 11:15    [14871392]     Ответить | Цитировать Сообщить модератору
 Re: Local time to UTC, туплю :(  [new]
abrashka
Member

Откуда:
Сообщений: 517
Гость333,

Спасибо!
Сделаю с учетом минут
23 сен 13, 11:15    [14871397]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить