Сравнение дат в Oracle с помощью функции decode

мне нужно сравнить две даты с помощью функции декодирования Oracle, чтобы узнать, является ли она less than or equal другие.

Я нашел эту статью - http://www.techonthenet.com/oracle/functions/decode.php

который заявляет (внизу), что функция декодирования ниже вернет date2, если date1 > date2:

decode((date1 - date2) - abs(date1 - date2), 0, date2, date1)

не будет ли это возвращать date2, если date1 >= date2 ?

или это просто если date1 > date2?

есть проще решение?

6 ответов


эта функция возвращает date2, если date2 if 0 - 0 = 0 then date2 else date1 где обе даты совпадают.

лучшее решение, если вы используете 8i или выше, чтобы использовать case:

select case when date1 >= date2 then date2 else date1 end from Your_Table;

С case позволяет операторам неравенства, это гораздо более читаемо.


@Аллан уже дал вам лучшее решение для меня, но если вы настаиваете на использовании


вы можете попробовать months_between. Это будет рассчитать количество месяцев между двумя датами, цифрами.

select months_between(sysdate+30, sysdate ) from dual;
select months_between(sysdate+15, sysdate ) from dual;

в этом примере первый параметр больше второго, поэтому он будет возвращать 1. Вторая строка возвращает ~0.48 (при выполнении примерно в 11: 30 утра 2010-09-01), чтобы получить фактические значения даты:

select case when months_between(sysdate+30, sysdate ) > 0 then sysdate+30 else sysdate end from dual;

В общем:

case when months_between(dateA, dateB ) > 0 then dateA else dateB

обновление:

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

select months_between(to_date('2010-10-16 23:59:59', 'YYYY-MM-DD HH24:MI:SS'),
                       to_date('2010-10-16 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
from dual;

...возвращает 0

но

select months_between(to_date('2010-10-17 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),
                       to_date('2010-10-16 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
from dual;

возвратит 0.032258064516129.

некоторые другие интересные даты разница / сравнить методы здесь: http://www.orafaq.com/faq/how_does_one_get_the_time_difference_between_two_date_columns


Если вы пытаетесь проверить по дате - то есть каждый раз в 1/1 меньше 1/2, и каждый на 1/1 равен каждому другому времени на 1/1, даже если дата Oracle больше - тогда вы хотите сравнить следующим образом:

TRUNC(DATE1)

Я не вижу этого в других ответах, это настолько основное, что заставляет меня задаться вопросом, правильно ли я понимаю вопрос.


вернет date2, когда date1 >= date2


лучше:

decode(sign(trunc(sysdate) - (trunc(sysdate))), 1, 1, -1, -1, 0 , 0)

1: date 1 > date 2
0: date 1 = date 2
-1: date 1 < date 2