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

Откуда:
Сообщений: 70
Люди добрые, помогите пожайлуста написать скрипт.

Есть таблица, в которой написано время:

2010.02.04 09:51:12
2010.02.04 09:51:12
2010.02.04 09:40:44
2010.02.04 09:37:34
2010.02.04 09:31:14
2010.02.04 07:32:52
2010.02.04 04:34:25
2010.02.04 04:32:52


Мне надо написать select штобы нашли время, которая больше чем 5 минут, приведущего времени. В этом примере должно найти :


2010.02.04 09:51:12
2010.02.04 09:37:34
2010.02.04 09:31:14
2010.02.04 07:32:52
8 мар 10, 15:39    [8445597]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116133
Рассмотрите аналитическую функцию lag.
На форуме масса примеров, в документации она тоже описана.
8 мар 10, 15:42    [8445606]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
AmKad
Member

Откуда:
Сообщений: 5222
fame,

with s as (
select to_date('2010-02-04 09:51:12', 'yyyy.mm.dd HH24:MI:SS') dt from dual union all  
select to_date('2010.02.04 09:51:12', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 09:40:44', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 09:37:34', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 09:31:14', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 07:32:52', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 04:34:25', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 04:32:52', 'yyyy.mm.dd HH24:MI:SS') from dual)

select dt
from
    (select dt, 
     lag(dt, 1, null) over (order by dt) df
     from s
    )
where dt - interval '300' second > df
order by dt
8 мар 10, 16:37    [8445712]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
AmKad
Member

Откуда:
Сообщений: 5222
fame,

with s as (
select to_date('2010-02-04 09:51:12', 'yyyy.mm.dd HH24:MI:SS') dt from dual union all  
select to_date('2010.02.04 09:51:12', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 09:40:44', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 09:37:34', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 09:31:14', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 07:32:52', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 04:34:25', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 04:32:52', 'yyyy.mm.dd HH24:MI:SS') from dual)

select distinct s1.dt
from   s s1
where s1.dt - interval '300' second > (select max(dt) from s where dt < s1.dt)
order by s1.dt
8 мар 10, 16:43    [8445733]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
Elic
Member

Откуда:
Сообщений: 29979
fame
5 минут
AmKad
interval '300' second
Зачем делать простое сложным?
'5' minute
8 мар 10, 19:02    [8446008]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Elic,

На автомате написал.
8 мар 10, 19:43    [8446070]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
fame
Member

Откуда:
Сообщений: 70
Спасибо за все предложение,
Я сделал вот как:

select datetime, datetime - lag(datetime,1,datetime) over (order by datetime asc) as new
from table1
order by datetime desc

Я получил, вот такие данные:

DATETIME NEW

2010.02.04 11:16:34 0,00108796296296296
2010.02.04 11:15:00 0,00347222222222222
2010.02.04 11:10:00 0,00347222222222222
2010.02.04 11:05:00 0,00347222222222222
2010.02.04 11:00:00 0,00347222222222222
2010.02.04 10:55:00 0,00347222222222222

A как можно перевести данные поле “new” на нужный формат;т.е. чтобы показывало время (были минуты и секунды).
18 мар 10, 15:54    [8498802]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
JaRo
Member

Откуда:
Сообщений: 1659
fame
A как можно перевести данные поле “new” на нужный формат;т.е. чтобы показывало время (были минуты и секунды).
умножить на соответсвущее число, если помнить, что это кол-во дней
18 мар 10, 15:57    [8498831]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
fame
Member

Откуда:
Сообщений: 70
а какое небуть другое решение есть?
18 мар 10, 17:50    [8500020]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
fame
а какое небуть другое решение есть?


А умножение и чтение уже предложенного вызывает затруднения?
18 мар 10, 18:23    [8500214]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
fame
Member

Откуда:
Сообщений: 70
JaRo,

А какое это число? Если она не постоянная и у меня 30000 строк, как предлагаете эту проблему решить?
19 мар 10, 10:59    [8502412]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
AmKad
Member

Откуда:
Сообщений: 5222
fame,

with s as (
select to_date('2010-02-04 09:51:12', 'yyyy.mm.dd HH24:MI:SS') dt from dual union all  
select to_date('2010.02.04 09:51:12', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 09:40:44', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 09:37:34', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 09:31:14', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 07:32:52', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 04:34:25', 'yyyy.mm.dd HH24:MI:SS') from dual union all    
select to_date('2010.02.04 04:32:52', 'yyyy.mm.dd HH24:MI:SS') from dual)

select dt, 
lag(dt, 1, dt) over (order by dt asc) dt_pred,
trunc((dt - lag(dt, 1, dt) over (order by dt asc)) * 24 * 60)       as minutes,
     ((dt - lag(dt, 1, dt) over (order by dt asc)) * 24 * 60 - 
trunc((dt - lag(dt, 1, dt) over (order by dt asc)) * 24 * 60)) * 60 as seconds
from s
order by dt desc
19 мар 10, 11:12    [8502517]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
fame
Member

Откуда:
Сообщений: 70
AmKad,

Да это работает,
Но как надо написать скрипт если я хочу просмотреть все времена из таблицы "table1". Там таких данных окала 30000. Я здесь только несколько строчек кинул.
19 мар 10, 17:13    [8506603]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
JaRo
Member

Откуда:
Сообщений: 1659
fame
Но как надо написать скрипт если я хочу просмотреть все времена из таблицы "table1". Там таких данных окала 30000. Я здесь только несколько строчек кинул.
Вообще-то with - это только эмулирование Ваших данных - уберите его и используйте свою таблицу.
19 мар 10, 17:18    [8506653]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
fame
Member

Откуда:
Сообщений: 70
Спасибо всем, работает прекрасно.
20 мар 10, 10:44    [8508173]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
fame
Member

Откуда:
Сообщений: 70
Простите за еще один вопрос, но как можно из этого select’a получить только те значение, где “minutes” > 6

with s as (
select to_date('2010-02-04 09:51:12', 'yyyy.mm.dd HH24:MI:SS') dt from dual union all
select to_date('2010.02.04 09:51:12', 'yyyy.mm.dd HH24:MI:SS') from dual union all
select to_date('2010.02.04 09:40:44', 'yyyy.mm.dd HH24:MI:SS') from dual union all
select to_date('2010.02.04 09:37:34', 'yyyy.mm.dd HH24:MI:SS') from dual union all
select to_date('2010.02.04 09:31:14', 'yyyy.mm.dd HH24:MI:SS') from dual union all
select to_date('2010.02.04 07:32:52', 'yyyy.mm.dd HH24:MI:SS') from dual union all
select to_date('2010.02.04 04:34:25', 'yyyy.mm.dd HH24:MI:SS') from dual union all
select to_date('2010.02.04 04:32:52', 'yyyy.mm.dd HH24:MI:SS') from dual)

select dt,
lag(dt, 1, dt) over (order by dt asc) dt_pred,
trunc((dt - lag(dt, 1, dt) over (order by dt asc)) * 24 * 60) as minutes,
((dt - lag(dt, 1, dt) over (order by dt asc)) * 24 * 60 -
trunc((dt - lag(dt, 1, dt) over (order by dt asc)) * 24 * 60)) * 60 as seconds
from s
order by dt desc
29 мар 10, 17:00    [8549460]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 1178
fame,

... where trunc((dt - lag(dt, 1, dt) over (order by dt asc)) * 24 * 60) > 6 ...
29 мар 10, 17:02    [8549475]     Ответить | Цитировать Сообщить модератору
 Re: Как найти нужное время  [new]
проходил мимо...
Member

Откуда: от верблюда
Сообщений: 1178
проходил мимо...,

чё-то я перепил вчера...

оборачивай в ещё один select.
29 мар 10, 17:03    [8549485]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить