Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Временные зоны у TIMESTAMP / 6 сообщений из 6, страница 1 из 1
17.06.2019, 12:00
    #39827160
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временные зоны у TIMESTAMP
Добрый день.

Есть дата системы локальная, вычисляемая в самой системе. Есть время сервера.
Эти два значения склеиваются следующим образом:
"Дата системы" + (SYSTIMESTAMP - TRUNC(SYSTIMESTAMP))

До недавнего времени всё было хорошо.
Но вот на новом проекте такая ситуация.
Создается документ вручную: Дата системы + ТЕКУЩЕЕ ВРЕМЯ.
Создается документ автоматически: Дата системы + текущее время МИНУС ТРИ ЧАСА.
Пакет создания документа один и тот же.
Анализом пакета было выявлено, что это тройка скорее всего часовой пояс.
В вызове SYSTIMESTAMP показывает +03:00.
Возможно, что дело в обертке, которая вызывает функцию создания документа.
Каким-то образом плывут часовые пояса и в результате получается минус три.
Можете подсказать из-за чего так происходит? Может это TRUNC() виноват?
...
Рейтинг: 0 / 0
17.06.2019, 12:04
    #39827163
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временные зоны у TIMESTAMP
Вот полный код вычисления даты:

Код: plsql
1.
v_dateHead TIMESTAMP := v_currDate +(SYSTIMESTAMP - TRUNC(SYSTIMESTAMP));
...
Рейтинг: 0 / 0
17.06.2019, 12:15
    #39827165
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временные зоны у TIMESTAMP
Так, ну это вылечилось вот этим:

Код: plsql
1.
v_dateHead TIMESTAMP := v_currDate +(SYSDATE- TRUNC(SYSDATE));




Теперь самый главный вопрос.
Почему так происходит? Объясните пожалуйста, или ткните в документацию.
...
Рейтинг: 0 / 0
17.06.2019, 13:03
    #39827191
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временные зоны у TIMESTAMP
IMNOПочему так происходит?
Начнем с того, что timestamp-ов есть ажно три штуки, и ведут они себя по разному.
Кроме того, SYSTIMESTAMP
авторReturns the system date, including fractional seconds and time zone of the system on which the database resides
Подробности тут:
https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch4datetime.htm
...
Рейтинг: 0 / 0
17.06.2019, 13:08
    #39827193
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временные зоны у TIMESTAMP
IMNOОбъясните пожалуйстаВременная метка неявно преобразуется в дату усечением зоны, а наоборот - добавлением локальной.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
SQL> select systimestamp, cast(trunc(cast(systimestamp as date)) as timestamp with time zone) from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
CAST(TRUNC(CAST(SYSTIMESTAMPASDATE))ASTIMESTAMPWITHTIMEZONE)
---------------------------------------------------------------------------
17-JUN-19 01.05.52.510000 PM +03:00
17-JUN-19 12.00.00.000000 AM +03:00

1 row selected.

SQL> exec execute immediate q'{alter session set time_zone='UTC'}'

PL/SQL procedure successfully completed.

SQL> /

SYSTIMESTAMP
---------------------------------------------------------------------------
CAST(TRUNC(CAST(SYSTIMESTAMPASDATE))ASTIMESTAMPWITHTIMEZONE)
---------------------------------------------------------------------------
17-JUN-19 01.05.52.511000 PM +03:00
17-JUN-19 12.00.00.000000 AM UTC

1 row selected.

...
Рейтинг: 0 / 0
17.06.2019, 13:12
    #39827199
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Временные зоны у TIMESTAMP
Elicдобавлением локальной.
Особо отметим: локальная - эта та, которая установлена в сессии БД, а не та, которая в телевизоре или в мобильнике :)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Временные зоны у TIMESTAMP / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]