Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Смещение часового пояса в секундах  [new]
Alibek B.
Member

Откуда:
Сообщений: 3921
Мне нужно получить unix timestamp с учетом выставленного в сессии часового пояса.
Получаю так: (sysdate - DATE'1970-01-01') * 86400 - extract(timezone_hour from systimestamp)*3600+extract(timezone_minute from systimestamp)*60
А можно сразу получить смещение в секундах? tz_offset возвращает строку.

Сообщение было отредактировано: 22 апр 21, 13:33
22 апр 21, 13:41    [22312500]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53140

А не проще sysdate сразу перегнать в UTC чтобы вычитать ничего не пришлось?..

Posted via ActualForum NNTP Server 1.5

22 апр 21, 13:45    [22312509]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
Alibek B.
Member

Откуда:
Сообщений: 3921
sysdate это ведь DATETIME, там нет информации о часовом поясе.
22 апр 21, 13:56    [22312524]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53140

Так найди функцию в которой она есть.

Posted via ActualForum NNTP Server 1.5

22 апр 21, 14:12    [22312541]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
Alibek B.
Member

Откуда:
Сообщений: 3921
В systimestamp есть.
Но timestamp не приводится к числовым значениям, я не могу вычесть с него DATE'1970-01-01'.
А если вычитать литеральный timestamp, то в нем нужно задать часовой пояс, то есть нужно использовать сложные выражения.
Или что имелось ввиду?
22 апр 21, 14:18    [22312546]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3022
Alibek B.

А если вычитать литеральный timestamp

SQL> select systimestamp-DATE'1970-01-01' u from dual;

U
---------------------------------------------------------------------------
+000018739 14:28:59.560434


.....
stax
22 апр 21, 14:32    [22312559]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
PuM256
Member

Откуда:
Сообщений: 96
Alibek B.
Мне нужно получить unix timestamp с учетом выставленного в сессии часового пояса.

Ни один из вариантов, предложенных выше, не учитывает часовой пояс СЕССИИ.
RTFM sysdate, systimestamp, current_time
22 апр 21, 14:57    [22312578]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
Alibek B.
Member

Откуда:
Сообщений: 3921
Не пойму, как использовать systimestamp напрямую.
Если вычесть из него литерал даты 1970-01-01, то результатом будет timestamp и с ним арифметические операции напрямую недопустимы, все равно нужны громоздкие выражения, чтобы получить число секунд в виде целого.
tz_offset(sessiontimezone) возвращает смещение в виде строки, его так же нельзя вычитать напрямую.
to_char(<datetime>, 'sssss') (количество секунд с полуночи) не работает с timestamp.
Наверное можно использовать interval, но не получилось.
22 апр 21, 15:47    [22312636]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53140

Alibek B.
Если вычесть из него литерал даты 1970-01-01, то результатом будет timestamp

Нет, не будет. Это будет interval, а для него есть пара забавных функций.

Posted via ActualForum NNTP Server 1.5

22 апр 21, 15:53    [22312643]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
PuM256
Member

Откуда:
Сообщений: 96
PuM256
Alibek B.
Мне нужно получить unix timestamp с учетом выставленного в сессии часового пояса.

Ни один из вариантов, предложенных выше, не учитывает часовой пояс СЕССИИ.
RTFM sysdate, systimestamp, current_time

Опечатка: current_timestamp
22 апр 21, 16:20    [22312674]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10177
Stax
Alibek B.

А если вычитать литеральный timestamp

SQL> select systimestamp-DATE'1970-01-01' u from dual;

U
---------------------------------------------------------------------------
+000018739 14:28:59.560434


.....
stax


Stax, DATE'1970-01-01' не есть литеральный timestamp. SYSTIMESTAMP выдает timestamp относительно dbtimezone а UNIX time это UTC, посему:

with t as (
           select sys_extract_utc(systimestamp) - timestamp '1970-01-01 00:00:00 utc' diff from dual
          )
select  extract(day from diff) * 24 * 3600 +
        extract(hour from diff) * 3600 +
        extract(minute from diff) * 60 +
        trunc(extract(second from diff)) unix
  from  t
/

      UNIX
----------
1619114365

SQL>


SY.
22 апр 21, 17:01    [22312698]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3022
SY,

я отвечал на "его (литерал даты 1970-01-01,) так же нельзя вычитать напрямую."

.....
stax
22 апр 21, 17:34    [22312711]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
delphinotes
Member

Откуда: Санкт-Петербург
Сообщений: 390
cast as date?
select (cast(systimestamp at time zone 'UTC' as date) - date'1970-01-01') * 86400 ut from dual;
22 апр 21, 19:29    [22312768]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
delphinotes
Member

Откуда: Санкт-Петербург
Сообщений: 390
Перечитал вопрос, а для учёта зоны в текущей сессии будет проще:
select (cast(current_timestamp as date) - date'1970-01-01') * 86400 ut from dual


... хотя unix time это же всегда UTC, поэтому правильнее предыдущий вариант, т.е.:
а) получаем текущее время в UTC
б) смотрим разницу в секундах от "нулевой" даты

Сообщение было отредактировано: 22 апр 21, 19:37
22 апр 21, 19:36    [22312771]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
Alibek B.
Member

Откуда:
Сообщений: 3921
Спасибо, понял.
Но по-моему это ничуть не проще, чем -(extract()*3600+extract()*60).
22 апр 21, 19:46    [22312779]     Ответить | Цитировать Сообщить модератору
 Re: Смещение часового пояса в секундах  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10177
Alibek B.
Спасибо, понял.
Но по-моему это ничуть не проще, чем -(extract()*3600+extract()*60).


Проще:

select  (cast(ts at time zone 'utc' as date) - date '1970-01-01') * 24 * 3600 unix
  from  dual
/

      UNIX
----------
1619117952

SQL>


Проверяем:

with t1 as (
            select  current_timestamp ts
              from  dual
           ),
     t2 as (
            select  (cast(ts at time zone 'utc' as date) - date '1970-01-01') * 24 * 3600 unix,
                    ts
              from  t1
           )
select  unix,
        ts,
        from_tz(timestamp '1970-01-01 00:00:00' + numtodsinterval(unix,'second'),'utc') at time zone sessiontimezone reverse_ts
  from  t2
/

      UNIX TS                                  REVERSE_TS
---------- ----------------------------------- --------------------------------------
1619117952 22-APR-21 02.59.12.632000 PM -04:00 22-APR-21 02.59.12.000000000 PM -04:00

SQL>


SY.
22 апр 21, 22:02    [22312818]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить