powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Смещение часового пояса в секундах
16 сообщений из 16, страница 1 из 1
Смещение часового пояса в секундах
    #40064720
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно получить unix timestamp с учетом выставленного в сессии часового пояса.
Получаю так: (sysdate - DATE'1970-01-01') * 86400 - extract(timezone_hour from systimestamp)*3600+extract(timezone_minute from systimestamp)*60
А можно сразу получить смещение в секундах? tz_offset возвращает строку.
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064723
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не проще sysdate сразу перегнать в UTC чтобы вычитать ничего не пришлось?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064727
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sysdate это ведь DATETIME, там нет информации о часовом поясе.
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064739
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так найди функцию в которой она есть.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064743
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В systimestamp есть.
Но timestamp не приводится к числовым значениям, я не могу вычесть с него DATE'1970-01-01'.
А если вычитать литеральный timestamp, то в нем нужно задать часовой пояс, то есть нужно использовать сложные выражения.
Или что имелось ввиду?
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064752
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.

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

Код: plsql
1.
2.
3.
4.
5.
SQL> select systimestamp-DATE'1970-01-01' u from dual;

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



.....
stax
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064764
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.
Мне нужно получить unix timestamp с учетом выставленного в сессии часового пояса.

Ни один из вариантов, предложенных выше, не учитывает часовой пояс СЕССИИ.
RTFM sysdate, systimestamp, current_time
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064790
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пойму, как использовать systimestamp напрямую.
Если вычесть из него литерал даты 1970-01-01, то результатом будет timestamp и с ним арифметические операции напрямую недопустимы, все равно нужны громоздкие выражения, чтобы получить число секунд в виде целого.
tz_offset(sessiontimezone) возвращает смещение в виде строки, его так же нельзя вычитать напрямую.
to_char(<datetime>, 'sssss') (количество секунд с полуночи) не работает с timestamp.
Наверное можно использовать interval, но не получилось.
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064793
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Если вычесть из него литерал даты 1970-01-01, то результатом будет timestamp

Нет, не будет. Это будет interval, а для него есть пара забавных функций.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064814
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PuM256
Alibek B.
Мне нужно получить unix timestamp с учетом выставленного в сессии часового пояса.

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

Опечатка: current_timestamp
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064832
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
Alibek B.

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

Код: plsql
1.
2.
3.
4.
5.
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, посему:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
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.
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064844
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

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

.....
stax
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064894
delphinotes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cast as date?
Код: plsql
1.
select (cast(systimestamp at time zone 'UTC' as date) - date'1970-01-01') * 86400 ut from dual;
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064897
delphinotes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перечитал вопрос, а для учёта зоны в текущей сессии будет проще:
Код: plsql
1.
select (cast(current_timestamp as date) - date'1970-01-01') * 86400 ut from dual



... хотя unix time это же всегда UTC, поэтому правильнее предыдущий вариант, т.е.:
а) получаем текущее время в UTC
б) смотрим разницу в секундах от "нулевой" даты
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064905
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, понял.
Но по-моему это ничуть не проще, чем -(extract()*3600+extract()*60).
...
Рейтинг: 0 / 0
Смещение часового пояса в секундах
    #40064932
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Спасибо, понял.
Но по-моему это ничуть не проще, чем -(extract()*3600+extract()*60).


Проще:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select  (cast(ts at time zone 'utc' as date) - date '1970-01-01') * 24 * 3600 unix
  from  dual
/

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

SQL>



Проверяем:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Смещение часового пояса в секундах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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