Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
andreymx Member Откуда: Запорожье Сообщений: 54869 |
Коллеги! подскажите умную статейку (лучше бы на русском), как корректно работать с локальным временем и 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] Ответить | Цитировать Сообщить модератору |
lkhfds
Guest |
http://sav-files.narod.ru/time_zones_of_the_world.html но в программах всё м.б. ещё интереснее. Например, в MS CRM, кроме текущих правил перехода на летнее/зимнее время, вшиты все законодательные изменения времени. Это сделано для того, чтобы просматривая исторические данные, видеть правильное время на тот исторический момент, а не в соответствии с текущим законодательством. |
27 фев 17, 22:20 [20248938] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Там просто записано дробное число (сутки и доля суток), от определённого стартового времени. Так что нужно спрашивать у разработчиков приложения, что там они прибавляют. |
||
27 фев 17, 22:47 [20249058] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54869 |
разрабы подтвердили - все даты/время в UTC |
27 фев 17, 23:11 [20249129] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54869 |
Насколько я понял, в текущей ситуации: Все входящие datetime - параметры хранимок-запросов - преобразовывать в utc. Даты тоже преобразовывать в datetime / utc. При выводе результата - наоборот, в локальное время. |
28 фев 17, 08:06 [20249396] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54869 |
коллеги! покритикуйте положительно в нужную сторону 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] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54869 |
интересно, как эта хрень сработает в момент перехода на зимнее-летнее время |
28 фев 17, 16:58 [20251623] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8335 |
andreymx, за всем этим серьезный вопрос - а надо ли клиенту, расположенному в Новосибирске отображать время события, произошедшего в Москве по Новосибирскому времени? Именно так стоит задача или это чисто поиграться? |
28 фев 17, 18:03 [20251896] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54869 |
Вся информация будет выдаваться по украинскому времени. |
28 фев 17, 18:13 [20251937] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54869 |
Формировать будут с компов, которые в Украине Хотя вопрос интересный, надо транслировать выше |
28 фев 17, 18:16 [20251950] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8335 |
andreymx, насколько я сталкивался - чаще надо отображать местное время события, не приводя его к локальному времени оператора, где бы он ни был. Соответственно, серверное время при записи в журнал событий приложения (getdate(), например) необходимо корректировать относительно местного операционного времени договора или иного бизнес-объекта. Например, постановку задач в расписание. |
28 фев 17, 18:32 [20251984] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54869 |
система поставляется как есть - всё время в UTC |
28 фев 17, 20:10 [20252244] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8335 |
в этом случае это задача программирования исключительно клиента. |
||
1 мар 17, 11:06 [20253417] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54869 |
пля, накололся, сцукоselect GETUTCDATE(), GETDATE()может выдавать разное количество мс
в результате время на эту дельту может отличаться от реального |
|||||
14 мар 17, 17:56 [20294709] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
это точность типа datetime, 0.00333 second зачем же хранить тысячные секунды, если эта точность не поддерживается выбранным типом? да и давно уже есть datetime2, если нужна точность |
|||||
14 мар 17, 18:01 [20294716] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54869 |
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] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
andreymx, Для произвольных дат не подходит, поскольку на разных локальных территориях могли практиковать разную временную зону, зимнее/летнее время и т.п. |
14 мар 17, 18:09 [20294749] Ответить | Цитировать Сообщить модератору |
Dmitry V. Liseev Member [заблокирован] Откуда: Санкт-Петербург Сообщений: 5489 |
А функции сервера сделают расчёт по часовому поясу сервера. Зачем он Вам? |
|||||
14 мар 17, 18:22 [20294801] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54869 |
нельзя использовать этот алгоритм на целый год с зимне-летним временем из-за GETUTCDATE(), т.к. эта GETUTCDATE() работает для текущей установки летнего времени |
||
25 окт 17, 09:20 [20897482] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8727 |
andreymx, Если вам нужно привести UTC дату-время к дате-времени клиента и сделать это непременно на сервер, то, как минимум, вам нужно знать тайм-зону клинета. Если тайм-зона клиента совпадает с тайм-зоной сервера, до достаточно "завернуть" метод DateTime.ToLocalTime в CLR и использовать его. Он "знает" обо всех "переводах стрелок часов" текущей зон и вам не придется изобретать велосипед. Если тайм-зона клиента отлична от тайм-зоной сервера, то нужно получать ее с клиента и "переводить" время через TimeZoneInfo.ConvertTimeFromUtc |
25 окт 17, 12:53 [20898506] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |