Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 тип DATE  [new]
Изучающий_Oracle_Forms
Member

Откуда:
Сообщений: 229
Очень хочется получить в запросе дату ближайшую к определенной дате..
например
есть документ от 30.05.2007
и есть LOV c доками
25.05.2007
15.04.2007
05.03.2007
как запросом получить ближайший документ по дате т.е 25.05.2007
23 июл 07, 16:47    [4424953]     Ответить | Цитировать Сообщить модератору
 Re: тип DATE  [new]
M_IV
Member

Откуда:
Сообщений: 1303
посчитайте минимальную разницу дат ...
23 июл 07, 16:48    [4424961]     Ответить | Цитировать Сообщить модератору
 Re: тип DATE  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Как вариант тоже, но лучше все-таки просто с min и group by
with t as (select to_date('27.05.2007', 'dd.mm.yyyy') dt from dual
union all
select to_date('15.04.2007', 'dd.mm.yyyy') from dual
union all
select to_date('05.03.2007', 'dd.mm.yyyy') from dual)
select first_value(dt) over (order by dt desc rows min(to_date('30.05.2007', 'dd.mm.yyyy') - dt) preceding) from t
group by dt
23 июл 07, 17:14    [4425140]     Ответить | Цитировать Сообщить модератору
 Re: тип DATE  [new]
for93t
Member

Откуда:
Сообщений: 260
xymbo
Как вариант тоже, но лучше все-таки просто с min и group by
with t as (select to_date('27.05.2007', 'dd.mm.yyyy') dt from dual
union all
select to_date('15.04.2007', 'dd.mm.yyyy') from dual
union all
select to_date('05.03.2007', 'dd.mm.yyyy') from dual)
select first_value(dt) over (order by dt desc rows min(to_date('30.05.2007', 'dd.mm.yyyy') - dt) preceding) from t
group by dt


Если будут присутствовать бОльшие даты, то Ваш запрос сработает неправильно.
Я бы сделал вот так:
SELECT MIN(t.date_) KEEP(DENSE_RANK FIRST ORDER BY ABS(TO_DATE('30.05.2007','dd.mm.yyyy') - t.date_)) nearest
  FROM (SELECT TO_DATE('10.06.2007','dd.mm.yyyy') date_ FROM dual UNION ALL
        SELECT TO_DATE('25.05.2007','dd.mm.yyyy') FROM dual UNION ALL
        SELECT TO_DATE('15.04.2007','dd.mm.yyyy') FROM dual UNION ALL
        SELECT TO_DATE('05.03.2007','dd.mm.yyyy') FROM dual) t
23 июл 07, 17:24    [4425195]     Ответить | Цитировать Сообщить модератору
 Re: тип DATE  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
for93t
xymbo
Как вариант тоже, но лучше все-таки просто с min и group by
with t as (select to_date('27.05.2007', 'dd.mm.yyyy') dt from dual
union all
select to_date('15.04.2007', 'dd.mm.yyyy') from dual
union all
select to_date('05.03.2007', 'dd.mm.yyyy') from dual)
select first_value(dt) over (order by dt desc rows min(to_date('30.05.2007', 'dd.mm.yyyy') - dt) preceding) from t
group by dt


Если будут присутствовать бОльшие даты, то Ваш запрос сработает неправильно.
Я бы сделал вот так:
SELECT MIN(t.date_) KEEP(DENSE_RANK FIRST ORDER BY ABS(TO_DATE('30.05.2007','dd.mm.yyyy') - t.date_)) nearest
  FROM (SELECT TO_DATE('10.06.2007','dd.mm.yyyy') date_ FROM dual UNION ALL
        SELECT TO_DATE('25.05.2007','dd.mm.yyyy') FROM dual UNION ALL
        SELECT TO_DATE('15.04.2007','dd.mm.yyyy') FROM dual UNION ALL
        SELECT TO_DATE('05.03.2007','dd.mm.yyyy') FROM dual) t

Да, для больших не будет, я подразумевал, что все даты перед этой датой.
23 июл 07, 17:26    [4425212]     Ответить | Цитировать Сообщить модератору
 Re: тип DATE  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116251
xymbo

Да, для больших не будет, я подразумевал, что все даты перед этой датой.


ИМХО тогда прокатывает и

SELECT max(dt) from t

:-)
23 июл 07, 17:43    [4425332]     Ответить | Цитировать Сообщить модератору
 Re: тип DATE  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2560
Да, ступил.
23 июл 07, 17:48    [4425362]     Ответить | Цитировать Сообщить модератору
 Re: тип DATE  [new]
Изучающий_Oracle_Forms
Member

Откуда:
Сообщений: 229
Спасибо..но чего-то пока не работает..ну скорее всего придется работать с max(dt)
23 июл 07, 18:14    [4425491]     Ответить | Цитировать Сообщить модератору
 Re: тип DATE  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116251
Изучающий_Oracle_Forms
Спасибо..но чего-то пока не работает..ну скорее всего придется работать с max(dt)


Хм. Что значит "придется" ?
Если у Вас действительно все даты перед "определенной", то так конечно и нужно делать.
Ну а если нет, то запрос возвратит неверный результат ...
23 июл 07, 18:18    [4425508]     Ответить | Цитировать Сообщить модератору
 Re: тип DATE  [new]
for93t
Member

Откуда:
Сообщений: 260
Изучающий_Oracle_Forms
Спасибо..но чего-то пока не работает..ну скорее всего придется работать с max(dt)

А что конкретно не работает, разрешите узнать?
24 июл 07, 09:12    [4426474]     Ответить | Цитировать Сообщить модератору
 Re: тип DATE  [new]
Изучающий_Oracle_Forms
Member

Откуда:
Сообщений: 229
Уже работает...просто небольшая специфика приложения...
Спасибо всем..
24 июл 07, 09:39    [4426574]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить