Гость
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получить разницу в датах в днях / 14 сообщений из 14, страница 1 из 1
05.10.2021, 13:11
    #40102072
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
Добрый день, подскажите, мне нужно анализировать разницу в двух дата в днях, в частности сравнивать полученную дату с указанным числом дней (например с 1 (один день), 2 (два дня) и т.д.).
Исходные даты в формате dd.mm.yyyy hh24:mi

Как в Oracle лучше это сделать:

Код: plsql
1.
select to_date('06.10.2021 16:00', 'dd.mm.yyyy hh24:mi') - to_date('05.10.2021 15:59', 'dd.mm.yyyy hh24:mi') from dual;



На выходе
1,00069444444444

В итоге как данную дату сравнить скажем с одним днем? round применить ?
...
Рейтинг: 0 / 0
05.10.2021, 14:36
    #40102105
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
wsnet,

1,00069444444444 - ето и есть в днях, 1 день и чутку (0.000694444*24*60=1 мин. )

.....
stax
...
Рейтинг: 0 / 0
05.10.2021, 17:41
    #40102155
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
Stax, не могли бы вы подсказать можно ли как-то сократить код запроса

Код: plsql
1.
2.
3.
4.
select decode(trunc(to_date('06.10.2021 16:00', 'dd.mm.yyyy hh24:mi') - to_date('05.10.2021 18:20', 'dd.mm.yyyy hh24:mi')), 0,
              trunc(to_date('06.10.2021 16:00', 'dd.mm.yyyy hh24:mi') - to_date('05.10.2021 18:20', 'dd.mm.yyyy hh24:mi')),
              trunc(to_date('06.10.2021 16:00', 'dd.mm.yyyy hh24:mi') - to_date('05.10.2021 18:20', 'dd.mm.yyyy hh24:mi')) + 1)
from dual;
...
Рейтинг: 0 / 0
05.10.2021, 17:57
    #40102158
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
wsnet, а логику какую преследуете? если между двумя датами меньше суток, то 0, а если больше, то сразу плюс день?
...
Рейтинг: 0 / 0
05.10.2021, 18:37
    #40102162
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
j2k, да именно так
...
Рейтинг: 0 / 0
05.10.2021, 18:50
    #40102165
SQL*Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
wsnet
Stax, не могли бы вы подсказать можно ли как-то сократить код запроса

Код: plsql
1.
2.
3.
4.
select decode(trunc(to_date('06.10.2021 16:00', 'dd.mm.yyyy hh24:mi') - to_date('05.10.2021 18:20', 'dd.mm.yyyy hh24:mi')), 0,
              trunc(to_date('06.10.2021 16:00', 'dd.mm.yyyy hh24:mi') - to_date('05.10.2021 18:20', 'dd.mm.yyyy hh24:mi')),
              trunc(to_date('06.10.2021 16:00', 'dd.mm.yyyy hh24:mi') - to_date('05.10.2021 18:20', 'dd.mm.yyyy hh24:mi')) + 1)
from dual;



j2k:
wsnet, а логику какую преследуете? если между двумя датами меньше суток, то 0, а если больше, то сразу плюс день?

wsnet:
j2k, да именно так

По-моему проще и понятнее будет вот так:
Код: plsql
1.
2.
3.
4.
select decode(trunc(to_date('06.10.2021 16:00', 'dd.mm.yyyy hh24:mi') - to_date('05.10.2021 18:20', 'dd.mm.yyyy hh24:mi'))
            , 0, 0
            , trunc(to_date('06.10.2021 16:00', 'dd.mm.yyyy hh24:mi') - to_date('05.10.2021 18:20', 'dd.mm.yyyy hh24:mi')) + 1)
from dual;
...
Рейтинг: 0 / 0
06.10.2021, 08:42
    #40102228
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
wsnet,

если разница ровно ххх дней, тож 1 добавлять?

ps
Код: plsql
1.
2.
3.
4.
5.
6.
  1* select ceil(1.0000) c1,ceil(1.0001) c2,ceil(-1.0001) c3,floor(-1.0001) f from dual
SQL> /

        C1         C2         C3          F
---------- ---------- ---------- ----------
         1          2         -1         -2



.....
stax
...
Рейтинг: 0 / 0
06.10.2021, 08:50
    #40102230
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
Stax, да тоже 1 добавить.

В продолжении темы, не могли бы вы указать, почему данные запросы носят разные результаты количества дней:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create table tab2 
(
  date1 date,
  date2 date
);

insert into tab2 (date1, date2) values (to_date('14.11.2020 0:23:09', 'dd.mm.yyyy hh24:mi:ss'), to_date('15.11.2020', 'dd.mm.yyyy'));

select t.date1,
         t.date2, 
         to_date(t.date2, 'dd.mm.yyyy hh24:mi:ss') - to_date(t.date1, 'dd.mm.yyyy hh24:mi:ss')  cnt
 from tab2 t;

-- cnt =1 
 
select to_date('15.11.2020', 'dd.mm.yyyy hh24:mi:ss') - to_date('14.11.2020 0:23:09', 'dd.mm.yyyy hh24:mi:ss')  cnt from dual;

-- cnt = 0,98
...
Рейтинг: 0 / 0
06.10.2021, 09:08
    #40102232
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
to_date(d date) - получаем неявное преобразование.

Если date, то to_char.
Если char, то to_date.


Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
Connected to Oracle Database 10g Release 10.2.0.3.0 
Connected as system@ORCL

SQL> 
SQL> create table tab2
  2  (
  3    date1 date,
  4    date2 date
  5  );

Table created


SQL> insert into tab2 (date1, date2) values (to_date('14.11.2020 0:23:09', 'dd.mm.yyyy hh24:mi:ss'), to_date('15.11.2020', 'dd.mm.yyyy'));

1 row inserted


SQL> commit;

Commit complete



SQL> select to_char(date1, 'dd.mm.yyyy hh24:mi:ss') d1, to_char(date2, 'dd.mm.yyyy hh24:mi:ss') d2 from tab2;

D1                  D2
------------------- -------------------
14.11.2020 00:23:09 15.11.2020 00:00:00

SQL> select to_date(t.date2, 'dd.mm.yyyy hh24:mi:ss') - to_date(t.date1, 'dd.mm.yyyy hh24:mi:ss') from tab2 t;

TO_DATE(T.DATE2,'DD.MM.YYYYHH24:MI:SS')-TO_DATE(T.DATE1,'DD.MM.YYYYHH24:MI:SS')
-------------------------------------------------------------------------------
                                                                              1

SQL> select to_date(t.date2, 'dd.mm.yyyy hh24:mi:ss'), to_date(t.date1, 'dd.mm.yyyy hh24:mi:ss') from tab2 t;

TO_DATE(T.DATE2,'DD.MM.YYYYHH24:MI:SS') TO_DATE(T.DATE1,'DD.MM.YYYYHH24:MI:SS')
--------------------------------------- ---------------------------------------
15.11.0020                              14.11.0020


SQL> select to_char(to_date(t.date2, 'dd.mm.yyyy hh24:mi:ss'), 'dd.mm.yyyy hh24:mi:ss') d1, to_char(to_date(t.date1, 'dd.mm.yyyy hh24:mi:ss'), 'dd.mm.yyyy hh24:mi:ss') d2 from tab2 t;

D1                  D2
------------------- -------------------
15.11.0020 00:00:00 14.11.0020 00:00:00

SQL> 

...
Рейтинг: 0 / 0
06.10.2021, 09:20
    #40102235
serpv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
to_date(date type) сначала date type по своему разуму переводит в to_char, а потом уже для него делает to_date по формату.

Код: sql
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.
26.
27.
28.
29.
30.
31.
SQL> alter session set NLS_DATE_FORMAT='DD-MM-YYYY';

Session altered.

SQL> select t.date1, t.date2, to_date(t.date2, 'dd.mm.yyyy hh24:mi:ss') - to_date(t.date1, 'dd.mm.yyyy hh24:mi:ss')  cnt  from tab2 t;

DATE1      DATE2             CNT
---------- ---------- ----------
14-11-2020 15-11-2020          1

SQL> select t.date1, t.date2, t.date2-t.date1 cnt  from tab2 t;

DATE1      DATE2             CNT
---------- ---------- ----------
14-11-2020 15-11-2020 .983923611

SQL> alter session set NLS_DATE_FORMAT='DD-MM-YYYY hh24:mi';

Session altered.

SQL> select t.date1, t.date2, to_date(t.date2, 'dd.mm.yyyy hh24:mi:ss') - to_date(t.date1, 'dd.mm.yyyy hh24:mi:ss')  cnt  from tab2 t;

DATE1            DATE2                   CNT
---------------- ---------------- ----------
14-11-2020 00:23 15-11-2020 00:00 .984027778

SQL> select t.date1, t.date2, t.date2-t.date1 cnt  from tab2 t;

DATE1            DATE2                   CNT
---------------- ---------------- ----------
14-11-2020 00:23 15-11-2020 00:00 .983923611
...
Рейтинг: 0 / 0
06.10.2021, 09:34
    #40102237
serpv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
...
Рейтинг: 0 / 0
06.10.2021, 10:40
    #40102284
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
serpv
to_date(date type) сначала date type по своему разуму переводит в to_char, а потом уже для него делает to_date по формату.

Код: sql
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.
26.
27.
28.
29.
30.
31.
SQL> alter session set NLS_DATE_FORMAT='DD-MM-YYYY';

Session altered.

SQL> select t.date1, t.date2, to_date(t.date2, 'dd.mm.yyyy hh24:mi:ss') - to_date(t.date1, 'dd.mm.yyyy hh24:mi:ss')  cnt  from tab2 t;

DATE1      DATE2             CNT
---------- ---------- ----------
14-11-2020 15-11-2020          1

SQL> select t.date1, t.date2, t.date2-t.date1 cnt  from tab2 t;

DATE1      DATE2             CNT
---------- ---------- ----------
14-11-2020 15-11-2020 .983923611

SQL> alter session set NLS_DATE_FORMAT='DD-MM-YYYY hh24:mi';

Session altered.

SQL> select t.date1, t.date2, to_date(t.date2, 'dd.mm.yyyy hh24:mi:ss') - to_date(t.date1, 'dd.mm.yyyy hh24:mi:ss')  cnt  from tab2 t;

DATE1            DATE2                   CNT
---------------- ---------------- ----------
14-11-2020 00:23 15-11-2020 00:00 .984027778

SQL> select t.date1, t.date2, t.date2-t.date1 cnt  from tab2 t;

DATE1            DATE2                   CNT
---------------- ---------------- ----------
14-11-2020 00:23 15-11-2020 00:00 .983923611



То есть как понять по своему разуму?
Или все зависит от NLS_DATE_FORMAT ?
...
Рейтинг: 0 / 0
06.10.2021, 10:58
    #40102289
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
wsnet,

У Вас поле в таблице имеет тип date (не строка)
применять ф-цию to_date не надо

разница считается date2-date1 (без to_date)

у ф-ции to_date 1-й параметр строка

происходит неявное преобразование date в varchar2(строку) с учетом NLS_DATE_FORMAT

можно такой формат задать, что to_date вообще будет слетать с ошибкой



.....
stax
...
Рейтинг: 0 / 0
06.10.2021, 17:41
    #40102424
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу в датах в днях
Stax
wsnet,

У Вас поле в таблице имеет тип date (не строка)
применять ф-цию to_date не надо

разница считается date2-date1 (без to_date)

у ф-ции to_date 1-й параметр строка

происходит неявное преобразование date в varchar2(строку) с учетом NLS_DATE_FORMAT

можно такой формат задать, что to_date вообще будет слетать с ошибкой



.....
stax


Огромное спасибо за пояснения!
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получить разницу в датах в днях / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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