powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получить разницу в датах в днях
14 сообщений из 14, страница 1 из 1
Получить разницу в датах в днях
    #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
Получить разницу в датах в днях
    #40102105
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

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

.....
stax
...
Рейтинг: 0 / 0
Получить разницу в датах в днях
    #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
Получить разницу в датах в днях
    #40102158
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet, а логику какую преследуете? если между двумя датами меньше суток, то 0, а если больше, то сразу плюс день?
...
Рейтинг: 0 / 0
Получить разницу в датах в днях
    #40102162
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
j2k, да именно так
...
Рейтинг: 0 / 0
Получить разницу в датах в днях
    #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
Получить разницу в датах в днях
    #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
Получить разницу в датах в днях
    #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
Получить разницу в датах в днях
    #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
Получить разницу в датах в днях
    #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
Получить разницу в датах в днях
    #40102237
serpv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Получить разницу в датах в днях
    #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
Получить разницу в датах в днях
    #40102289
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

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

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

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

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

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



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

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

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

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

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

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



.....
stax


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


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