Сравнение дат в 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)
Я не вижу этого в других ответах, это настолько основное, что заставляет меня задаться вопросом, правильно ли я понимаю вопрос.
лучше:
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