powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Inerval между 2 DateTimeStamp в милисекундах
8 сообщений из 8, страница 1 из 1
Inerval между 2 DateTimeStamp в милисекундах
    #40101216
Петров Андрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищи, подскажите как получить цифру в милисекундах вычитая 2 Datetimestamp?
Не хочется городить набор Extract-ов... Может как то проще можно?

Код: plsql
1.
2.
3.
with t as 
(select systimestamp - to_timestamp( sysdate ) range_time from dual)
select EXTRACT(Second FROM range_time)*1000+ EXTRACT(Minute FROM range_time)*1000*60+EXTRACT(HOUR FROM range_time)*60*60*1000 from t;
...
Рейтинг: 0 / 0
Inerval между 2 DateTimeStamp в милисекундах
    #40101266
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.
...
Рейтинг: 0 / 0
Inerval между 2 DateTimeStamp в милисекундах
    #40101271
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Петров Андрей,

дни умышленно не учитываете?

.....
stax
...
Рейтинг: 0 / 0
Inerval между 2 DateTimeStamp в милисекундах
    #40101340
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> with t as
  2  (select systimestamp - to_timestamp( sysdate ) range_time from dual)
  3  select EXTRACT(Second FROM range_time) *1000
  4       + EXTRACT(Minute FROM range_time)*60*1000
  5  	  + EXTRACT(HOUR FROM range_time)*60*60*1000
  6  	  + EXTRACT(DAY FROM range_time)*24*60*60*1000 ex
  7  	 , ((to_date('1','J')+range_time*1000)-to_date('1','J'))*86400 dt_arith
  8    from t;

        EX   DT_ARITH
---------- ----------
51855908,1   51855908

SQL> 


...так можно конвертнуть до 14.7 лет с копейками "в плюс".
Для отрицательных интервалов можно взять другую базу либо знак учитывать отдельно.
...
Рейтинг: 0 / 0
Inerval между 2 DateTimeStamp в милисекундах
    #40101489
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> with t as
  2  (select systimestamp - to_timestamp( sysdate ) range_time from dual)
  3  select EXTRACT(Second FROM range_time) *1000
  4       + EXTRACT(Minute FROM range_time)*60*1000
  5  	  + EXTRACT(HOUR FROM range_time)*60*60*1000
  6  	  + EXTRACT(DAY FROM range_time)*24*60*60*1000 ex
  7  	 , ((to_date('1','J')+range_time*1000)-to_date('1','J'))*86400 dt_arith
  8    from t;

        EX   DT_ARITH
---------- ----------
51855908,1   51855908

SQL> 


...так можно конвертнуть до 14.7 лет с копейками "в плюс".
Для отрицательных интервалов можно взять другую базу либо знак учитывать отдельно.
Вряд ли у желтого есть какие-то преимущества перед
Код: plsql
1.
(range_time+sysdate-sysdate)*86400


Более того, скорее всего у ТС есть время начала и конца и тогда будет еще меньше букв (если все что меньше секунды не интересует)
Код: plsql
1.
((ts2-0)-(ts1-0))*86400


А если таки надо в миллисекундах, то всё уже давно отвечено в позапрошлом десятилетии (решение SY самое лаконичное если есть начало и конец а не просто дельта)

23:59:59
конвертировать TIMESTAMP в NUMBER

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with t0 as
 (select timestamp '2021-09-01 00:00:00.000000' ts1,
         timestamp '2021-09-01 12:34:56.123456' ts2
    from dual),
t as
 (select ts1, ts2, ts2 - ts1 range_time from t0)
select extract(second from ts2 - ts1) + extract(minute from ts2 - ts1) * 60 + extract(hour from ts2 - ts1) * 60 * 60 dummy,
       ((sysdate - (sysdate - (ts2 - ts1 - numtodsinterval(extract(second from ts2 - ts1), 'second')))) * 86400 + extract(second from ts2 - ts1)) as elic,
       (trunc(ts2, 'MI') - trunc(ts1, 'MI')) * 24 * 60 * 60 + extract(second from(ts2 - ts1)) sy,
       ((to_date('1','J')+range_time)-to_date('1','J'))*86400 dt_arith
       ,((ts2-0)-(ts1-0))*86400 dt_arith1
       ,(range_time+sysdate-sysdate)*86400 dt_arith2
  from t;

     DUMMY       ELIC         SY   DT_ARITH  DT_ARITH1  DT_ARITH2
---------- ---------- ---------- ---------- ---------- ----------
45296.1235 45296.1235 45296.1235      45296      45296      45296



PS. Петров делая по шагу в пятилетку может далеко не уйти.
Замерить длительность в мс
...
Рейтинг: 0 / 0
Inerval между 2 DateTimeStamp в милисекундах
    #40101490
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кобанчег,

Да, и по мотивам Среднее значение интервалов
Код: plsql
1.
(range_time+sysdate-sysdate)*86400 + mod(extract(second from range_time),1) dt_arith3
...
Рейтинг: 0 / 0
Inerval между 2 DateTimeStamp в милисекундах
    #40101680
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Кобанчег#22378666]
andrey_anonymous

А если таки надо в миллисекундах, то всё уже давно отвечено в позапрошлом десятилетии (решение SY самое лаконичное если есть начало и конец а не просто дельта)



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> l
  1  with t as (
  2               select  TIMESTAMP '2008-09-12 09:29:59.123000' s,
  3                       TIMESTAMP '2008-09-12 09:30:00.000000' e
  4                 from  dual
  5              )
  6*   select e-s i,(trunc(e,'MI') - trunc(s,'MI')) * 24 * 60 * 60 + extract(second from (e - s)) sy from t
SQL> /

I                                      SY
------------------------------ ----------
+000000000 00:00:00.877000000      60.877

SQL>



.....
stax
...
Рейтинг: 0 / 0
Inerval между 2 DateTimeStamp в милисекундах
    #40101758
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Да, есть проблемы, надо секунды отдельно вычитать из начала и конца а не из разницы.
date_arith1 тоже имеет проблемы.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with t0 as
 (select timestamp '2021-09-01 00:00:00.000000' ts1, timestamp '2021-09-01 12:34:56.123456' ts2 from dual
union all select timestamp '2021-09-01 00:00:59.000000' ts1, timestamp '2021-09-01 00:01:56.123456' ts2 from dual
union all select timestamp '2021-09-01 00:00:59.900000' ts1, timestamp '2021-09-01 00:01:56.123456' ts2 from dual
),
t as
 (select ts1, ts2, ts2 - ts1 range_time from t0)
select extract(second from ts2 - ts1) + extract(minute from ts2 - ts1) * 60 + extract(hour from ts2 - ts1) * 60 * 60 dummy,
       ((sysdate - (sysdate - (ts2 - ts1 - numtodsinterval(extract(second from ts2 - ts1), 'second')))) * 86400 + extract(second from ts2 - ts1)) as elic,
       (trunc(ts2, 'MI') - trunc(ts1, 'MI')) * 24 * 60 * 60 + extract(second from (ts2-ts1)) sy,
       --(trunc(ts2, 'MI') - trunc(ts1, 'MI')) * 24 * 60 * 60 + extract(second from ts2)-extract(second from ts1) sy,
       ((to_date('1','J')+range_time)-to_date('1','J'))*86400 dt_arith
       ,((ts2-0)-(ts1-0))*86400 dt_arith1
       --,(ts2-ts1+sysdate-sysdate)*86400 dt_arith1
       ,(range_time+sysdate-sysdate)*86400 dt_arith2
       ,(range_time+sysdate-sysdate)*86400 + mod(extract(second from range_time),1) dt_arith3
  from t;

     DUMMY       ELIC         SY   DT_ARITH  DT_ARITH1  DT_ARITH2  DT_ARITH3
---------- ---------- ---------- ---------- ---------- ---------- ----------
45296.1235 45296.1235 45296.1235      45296      45296      45296 45296.1235
 57.123456  57.123456 117.123456         57         57         57  57.123456
 56.223456  56.223456 116.223456         56         57         56  56.223456



В коментах исправленные версии, но dt_arith1 теряет смысл как отдельное решение превращаясь в dt_arith2.
Впрочем, все dt_arith* кроме dt_arith3 приведенное Эликом в позапрошлом деятилетии - ни о чём.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Inerval между 2 DateTimeStamp в милисекундах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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