Автор Тема: Разница между двумя датами в днях (Oracle SQL)  (Прочитано 51634 раз)

Марахтанов Алексей

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 205
    • marahtanov.ru
Иногда разработчики жалуются, что в СУБД ORACLE есть функция months_between, которая вычисляет разницу между двумя датами в месяцах (например, select months_between(sysdate, to_date ('1983/03/06', 'yyyy/mm/dd')) from dual), но нет функции, которая вернет то же самое в днях.

Действительно, такой функции в Oracle нет, однако есть простая возможность получать разницу в днях путем вычитания одной даты из другой.

Например, такой запрос

select sysdate - to_date ('2011/05/20', 'yyyy/mm/dd') from dual

вернет разницу в днях (на момент написания статьи - 7,51971...) - как видно, это дробное, а не целое число. Если требуется найти именно целое число, сколько полных дней прошло от даты до даты, достаточно каждую дату обработать функцией TRUNC (она оставит от каждой даты только число, отбросив часы, минуты и секунды) или конечный результат округлить этой же функцией TRUNC (округлит число в меньшую сторону)

select TRUNC(sysdate) - TRUNC(to_date ('2011/05/20', 'yyyy/mm/dd')) from dual
или
select TRUNC(sysdate - to_date ('2011/05/20', 'yyyy/mm/dd')) from dual

Оба запроса вернут уже просто число 7: 7 дней между 20 и 27 мая (sysdate на момент написания статьи возвращал 27 мая).


Вообще с датами в ORACLE можно очень легко работать, применяя к ним различные арифметические операции.

Например, получать дату, на день позже, чем заданная, вот так (прибавив к дате 1):
select to_date ('2011/05/20 13:10:00', 'yyyy/mm/dd HH24:MI:SS') + 1 from dual // вернет 2011/05/21 13:10:00

Прибавлять 2 часа к дате (2/24 = 2 часа):
select to_date ('2011/05/20 13:10:00', 'yyyy/mm/dd HH24:MI:SS') + 2/24 from dual // вернет 2011/05/20 15:10:00

Получать возраст человека по дате его рождения:
select TRUNC (months_between(sysdate, to_date ('1983/03/06', 'yyyy/mm/dd'))/12) from dual // 28
« Последнее редактирование: 27 Май 2011, 18:37:19 от Марахтанов Алексей »