Результат timediff десятичный oracle 11g - PullRequest
0 голосов
/ 04 августа 2020

Я хочу получить номер, как показано ниже.

Пример.

Atime 20200803 180000

Btike 20200803 183000

Select (to_date(atime, 'yyyymmddhh24miss') -to_date(btime, 'yyyymmddhh24miss'))*24

From dual

Результатом выше будет 0,5, но на выходе будет 0,499999.

Если я использую функцию round oracle, я думаю, что это будет решено. Но мне это так любопытно.

Я попытался найти эту причину, используя ключевое слово вроде «проблема с разницей по времени в oracle, проблема с десятичной разницей по времени в oracle», но я не могу найти причину ..

Почему такой результат? Или вы могли бы назвать мне ключевое слово для поиска причины?

Спасибо, что прочитали мой вопрос.

1 Ответ

1 голос
/ 04 августа 2020

То, что вы получаете, - это арифметическая c разница, которая представляет собой десятичное представление этой разницы в числовом формате, которое не имеет ничего общего с разницей во времени в минутах или часах.

Пусть Я покажу вам пример

SQL> select to_date('20200803183000','yyyymmddhh24miss') - to_date('20200803173000','yyyymmddhh24miss') from dual ;

TO_DATE('20200803183000','YYYYMMDDHH24MISS')-TO_DATE('20200803173000','YYYYMMDDH
--------------------------------------------------------------------------------
                                                                      .041666667

В приведенном выше запросе вычисляется разница во времени между двумя датами, но на выходе получается десятичное представление в формате numeri c, которое я могу перевести в минуты

SQL> select ( to_date('20200803183000','yyyymmddhh24miss') - to_date('20200803173000','yyyymmddhh24miss') ) * 24 * 60 from dual ;

(TO_DATE('20200803183000','YYYYMMDDHH24MISS')-TO_DATE('20200803173000','YYYYMMDD
--------------------------------------------------------------------------------
                                                                              60

SQL>

Если хотите в часах

SQL>  select ( to_date('20200803183000','yyyymmddhh24miss') - to_date('20200803180000','yyyymmddhh24miss') ) * 24 from dual ;

(TO_DATE('20200803183000','YYYYMMDDHH24MISS')-TO_DATE('20200803180000','YYYYMMDD
--------------------------------------------------------------------------------
                                                                              .5

Обновить

@ AlexPoole был прав. Это связано с настройкой set numwith

SQL> set numwidth 42
SQL>  select ( to_date('20200803183000','yyyymmddhh24miss') - to_date('20200803180000','yyyymmddhh24miss') ) * 24 from dual ;

(TO_DATE('20200803183000','YYYYMMDDHH24MISS')-TO_DATE('20200803180000','YYYYMMDDHH24MISS'))*24
----------------------------------------------------------------------------------------------
                                                     .4999999999999999999999999999999999999992

SQL> set numwidth 39
SQL>  select ( to_date('20200803183000','yyyymmddhh24miss') - to_date('20200803180000','yyyymmddhh24miss') ) * 24 from dual ;

(TO_DATE('20200803183000','YYYYMMDDHH24MISS')-TO_DATE('20200803180000','YYYYMMDDHH24MISS'))*24
----------------------------------------------------------------------------------------------
                                                                                            .5

Параметр NUMWIDTH управляет шириной по умолчанию, используемой при отображении значений numeri c. Мой Sqlplus использовал значение по умолчанию 39, поэтому я видел 0,5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...