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

Откуда: Запорожье
Сообщений: 53724
Коллеги!
подскажите умную статейку (лучше бы на русском), как корректно работать с локальным временем и UTC
когда и как, что и во что конвертировать

тут вроде неплохая статейка, но с моим опытом не берусь оценить корректность и сопровождаемость

Пример:
есть БД (не моя)
есть поле - CreatedDate
тип поля студия показывает как DateTime
время в UTC - если писать рядовой SELECT, то отличается от зонального на 2 часа (в придаваемом приложении)

В какой момент и как в хранимках преобразовывать входящие параметры (датавремя) и результат в локальные значения?

Скажем, как корректно отобрать данные за период локального времени
с {ts '2017-01-01 05:00:00.000'} по {ts '2017-01-01 06:00:00.000'}?

входящие параметры
@date_from = {ts '2017-01-01 05:00:00.000'}
@date_to = {ts '2017-01-01 06:00:00.000'}

select createdDate  from table
 where createdDate >= @date_from
   and createdDate <= @date_to


С уважением, АМ
27 фев 17, 19:24    [20248490]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
lkhfds
Guest
http://sav-files.narod.ru/time_zones_of_the_world.html

но в программах всё м.б. ещё интереснее.

Например, в MS CRM, кроме текущих правил перехода на летнее/зимнее время, вшиты все законодательные изменения времени.
Это сделано для того, чтобы просматривая исторические данные, видеть правильное время на тот исторический момент, а не в соответствии с текущим законодательством.
27 фев 17, 22:20    [20248938]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30773
andreymx
есть поле - CreatedDate
тип поля студия показывает как DateTime
время в UTC - если писать рядовой SELECT, то отличается от зонального на 2 часа (в придаваемом приложении)
В типе DateTime нет места для хранения тайм-зон.
Там просто записано дробное число (сутки и доля суток), от определённого стартового времени.
Так что нужно спрашивать у разработчиков приложения, что там они прибавляют.
27 фев 17, 22:47    [20249058]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53724
разрабы подтвердили - все даты/время в UTC
27 фев 17, 23:11    [20249129]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53724
Насколько я понял, в текущей ситуации:
Все входящие datetime - параметры хранимок-запросов - преобразовывать в utc. Даты тоже преобразовывать в datetime / utc.
При выводе результата - наоборот, в локальное время.
28 фев 17, 08:06    [20249396]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
lkhfds
Guest
http://stocktime.ru/utc.htm
UTC

https://habrahabr.ru/post/130305/
Изменение часовых зон в России, Белоруссии и на Украине

http://www.worldtimezone.com/dst_news/dst_news_russia-history.html
Постановления (декреты, указания) и таблица изменения времени в России с июля 1917 года
28 фев 17, 09:30    [20249639]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53724
коллеги!
покритикуйте положительно в нужную сторону

alter FUNCTION dbo.local_to_utc_datetime
(
	@p_datetime datetime
)
RETURNS datetime
AS
BEGIN

    return DATEADD(ms, DATEDIFF(ms, GETDATE(), GETUTCDATE()), @p_datetime) 

END


create FUNCTION dbo.utc_to_local_datetime
(
	@p_datetime datetime
)
RETURNS datetime
AS
BEGIN

    return DATEADD(ms, DATEDIFF(ms, GETUTCDATE(), GETDATE()), @p_datetime) 

END
28 фев 17, 16:58    [20251620]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53724
интересно, как эта хрень сработает в момент перехода на зимнее-летнее время
28 фев 17, 16:58    [20251623]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
Владислав Колосов
Member

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

за всем этим серьезный вопрос - а надо ли клиенту, расположенному в Новосибирске отображать время события, произошедшего в Москве по Новосибирскому времени? Именно так стоит задача или это чисто поиграться?
28 фев 17, 18:03    [20251896]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53724
Вся информация будет выдаваться по украинскому времени.
28 фев 17, 18:13    [20251937]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53724
Формировать будут с компов, которые в Украине
Хотя вопрос интересный, надо транслировать выше
28 фев 17, 18:16    [20251950]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
Владислав Колосов
Member

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

насколько я сталкивался - чаще надо отображать местное время события, не приводя его к локальному времени оператора, где бы он ни был. Соответственно, серверное время при записи в журнал событий приложения (getdate(), например) необходимо корректировать относительно местного операционного времени договора или иного бизнес-объекта. Например, постановку задач в расписание.
28 фев 17, 18:32    [20251984]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53724
система поставляется как есть - всё время в UTC
28 фев 17, 20:10    [20252244]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
lkhfds
Guest
с sql 2008
select GETUTCDATE(), GETDATE(), SYSDATETIMEOFFSET(),
SUBSTRING(CONVERT(VARCHAR(100),SYSDATETIMEOFFSET(),121),29,6),
[timeoffset]=cast(SUBSTRING(CONVERT(VARCHAR(100),SYSDATETIMEOFFSET(),121),29,3) as int)
28 фев 17, 21:42    [20252428]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
andreymx
система поставляется как есть - всё время в UTC


в этом случае это задача программирования исключительно клиента.
1 мар 17, 11:06    [20253417]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53724
пля, накололся, сцуко
select GETUTCDATE(), GETDATE()
может выдавать разное количество мс
(No column name)(No column name)
2017-03-14 14:51:53.3002017-03-14 16:51:53.287


в результате время на эту дельту может отличаться от реального
14 мар 17, 17:56    [20294709]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
o-o
Guest
andreymx
пля, накололся, сцуко
select GETUTCDATE(), GETDATE()
может выдавать разное количество мс
(No column name)t(No column name)
2017-03-14 14:51:53.300t2017-03-14 16:51:53.287


в результате время на эту дельту может отличаться от реального

это точность типа datetime, 0.00333 second
зачем же хранить тысячные секунды,
если эта точность не поддерживается выбранным типом?
да и давно уже есть datetime2, если нужна точность
14 мар 17, 18:01    [20294716]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53724
alter FUNCTION dbo.local_to_utc_datetime
(
	@p_datetime datetime
)
RETURNS datetime
AS
BEGIN

    return DATEADD(ms, DATEDIFF(ms, GETDATE(), GETUTCDATE()), @p_datetime) 

END
поменял ms на s, всё стабилизнулось
14 мар 17, 18:05    [20294731]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
andreymx,

Для произвольных дат не подходит, поскольку на разных локальных территориях могли практиковать разную временную зону, зимнее/летнее время и т.п.
14 мар 17, 18:09    [20294749]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
Dmitry V. Liseev
Member [заблокирован]

Откуда: Санкт-Петербург
Сообщений: 5490
andreymx
пля, накололся, сцуко
select GETUTCDATE(), GETDATE()
может выдавать разное количество мс
(No column name)t(No column name)
2017-03-14 14:51:53.300t2017-03-14 16:51:53.287


в результате время на эту дельту может отличаться от реального
Вам уже сказали, что на сервере нет смысла извращаться. Скорее всего преобразованием дат и времени занимается клиент. Если он стоит в Новосибирске, то показывает одно время. Если в Украине - другое. То есть, расчёт идёт по часовому поясу клиента. Обычно так и делают в распределённых приложениях. К примеру, на данном форуме в профиле я могу указать свою таймзону. И тогда все сообщения на моём компе будут отображать время по моей таймзоне, даже если они созданы человеком в США. То есть, сервер хранит в UTC, но пересчитывает по моей таймзоне из профиля, когда отдаёт мне.

А функции сервера сделают расчёт по часовому поясу сервера. Зачем он Вам?
14 мар 17, 18:22    [20294801]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53724
andreymx
create FUNCTION dbo.utc_to_local_datetime
(
	@p_datetime datetime
)
RETURNS datetime
AS
BEGIN

    return DATEADD(ms, DATEDIFF(ms, GETUTCDATE(), GETDATE()), @p_datetime) 

END
так и оказалось - не всё так гладко
нельзя использовать этот алгоритм на целый год с зимне-летним временем из-за GETUTCDATE(), т.к. эта GETUTCDATE() работает для текущей установки летнего времени
25 окт 17, 09:20    [20897482]     Ответить | Цитировать Сообщить модератору
 Re: тайм зоны и UTC  [new]
msLex
Member

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

Если вам нужно привести UTC дату-время к дате-времени клиента и сделать это непременно на сервер, то, как минимум, вам нужно знать тайм-зону клинета.

Если тайм-зона клиента совпадает с тайм-зоной сервера, до достаточно "завернуть" метод DateTime.ToLocalTime в CLR и использовать его. Он "знает" обо всех "переводах стрелок часов" текущей зон и вам не придется изобретать велосипед.

Если тайм-зона клиента отлична от тайм-зоной сервера, то нужно получать ее с клиента и "переводить" время через TimeZoneInfo.ConvertTimeFromUtc
25 окт 17, 12:53    [20898506]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить