Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Запрос SQL, возможно ли

21K
28 сентября 2006 года
DIR3ct0r
4 / / 28.09.2006
имеется несколько записей в БД,
01.01.2006 0:30:00
01.01.2006 1:00:00
01.01.2006 2:30:00
02.01.2006 0:30:00

вопрос, возможно ли, выбрать из БД записи, разность между которыми более получаса (30 мин). т.е получить следующий набор:

01.01.2006 1:00:00
01.01.2006 2:30:00
02.01.2006 0:30:00

следующие записи не выбираются, т.к разница между ними по часа:
01.01.2006 0:30:00
01.01.2006 1:00:00

подскажите пожалйуста...
385
28 сентября 2006 года
SomewherSomehow
477 / / 25.07.2004
Возможно. Почему-то опять не указана бд. Например в mssql есть такая функция:
 
Код:
select * from mytable where
datediff(mi,DateField1,DateField2)>30

Соответсвенно поищи в справке к своей субд, наверняка есть что-то подобное...
10
28 сентября 2006 года
Freeman
3.2K / / 06.03.2004
[QUOTE=DIR3ct0r]вопрос, возможно ли, выбрать из БД записи, разность между которыми более получаса (30 мин). т.е получить следующий набор:[/QUOTE]
По-моему, только если сервер поддерживает иерархические зависимости, ключевые слова: connect by и start with.

[QUOTE=SomewherSomehow]Возможно. Почему-то опять не указана бд. Например в mssql есть такая функция:
 
Код:
select * from mytable where
datediff(mi,DateField1,DateField2)>30
[/QUOTE]
Пример не соответствует задаче - datediff вычисляет разницу между полями, тогда как тут требуется разность между строками.
21K
28 сентября 2006 года
DIR3ct0r
4 / / 28.09.2006
СУБД, на которых возможно будет выполнятся запрос Interbase, MSSQL, MySQL, Oracle.

Перечисленные выше штампы времени являются значениями атрибута Data_Date, т.е в таблице БД, например 3 поля:

Code | Data_Date |Value
1 | 01.01.2006 0:30:00 | 10
1 | 01.01.2006 1:00:00 | 20
1 | 01.01.2006 2:30:00 | ...
1 | 02.01.2006 0:30:00 | ...

и т.д.

Функции DATEADD и подобные точно нет в Interbase...
21K
28 сентября 2006 года
DIR3ct0r
4 / / 28.09.2006
Цитата:

Пример не соответствует задаче - datediff вычисляет разницу между полями, тогда как тут требуется разность между строками.



совершенно верно :(

Если в кратце, то суть следующая.....в таблице данные разбиты по получасовкам, т.е в сутки 48 получасовок....необходимо определить дыры между получасовками, чтобы заполнить их нулевыми значениями.
Можно конечно выбирать все получасовки и сравнивать в цикле, но данных очень много и результат такого запроса займет ну просто умопомрачительный размер памяти.

10
28 сентября 2006 года
Freeman
3.2K / / 06.03.2004
[QUOTE=DIR3ct0r]СУБД, на которых возможно будет выполнятся запрос Interbase, MSSQL, MySQL, Oracle.[/QUOTE]
Для Oracle примерно так:
 
Код:
select
  data_date
from
  data_table
connect by
  to_char(prior data_date, 'SSSSS') - to_char(data_date, SSSSS) = 30 * 60 * 100
start with
  data_date is not null
where
  level = 1
385
28 сентября 2006 года
SomewherSomehow
477 / / 25.07.2004
[QUOTE=Freeman]Пример не соответствует задаче - datediff вычисляет разницу между полями, тогда как тут требуется разность между строками.[/QUOTE]
Говорить что datediff вычисляет разницу между полями - всеравно что говорить "маркером можно писать только на бумаге"...у тебя есть инструмент а уж как ты его используешь - другой вопрос. datediff - прежде всего считает разность между двумя датами...а в примере это просто проиллюстрировано...
385
28 сентября 2006 года
SomewherSomehow
477 / / 25.07.2004
и совсем не обязательно:
[QUOTE=Freeman]
По-моему, только если сервер поддерживает иерархические зависимости, ключевые слова: connect by и start with.
[/QUOTE]
можно и так:
Код:
declare @table table (id int identity primary key, MyDate datetime)

insert into @table
select '01.01.2006 0:30:00'

insert into @table
select '01.01.2006 1:00:00'

insert into @table
select '01.01.2006 2:30:00'

insert into @table
select '02.01.2006 0:30:00'

select *
from
@table t1
where
exists
(
    select id from @table t2
    where
    (
        datediff(mi,t1.MyDate,t2.MyDate)>30 and
        t2.id = (select top 1 id from @table t3 where t3.id > t1.id)
    )      
)

единственное что, это последнее значение не будет попадать в выборку, но и это можно обойти условием в запросе...было бы желание...
10
28 сентября 2006 года
Freeman
3.2K / / 06.03.2004
[QUOTE=SomewherSomehow]Говорить что datediff вычисляет разницу между полями - всеравно что говорить "маркером можно писать только на бумаге"...у тебя есть инструмент а уж как ты его используешь - другой вопрос. datediff - прежде всего считает разность между двумя датами...[/QUOTE]
Аргументация понятна, но не принимается. Суть вопроса была прежде всего в том, как выбрать нужные строки, а не как получить разность между датами. Советовать datedif в данном случае - "умный ответ", отписка.

[QUOTE=SomewherSomehow]и совсем не обязательно:[/QUOTE]
Временные таблицы превращают СУБД в алгоритмическое средство программирования, что противоречит реляционному взгляду на данные. К сожалению, в большинстве серверов без них не обойтись. Под невозможностью решения я подразумевал отсутствие реляционных средств, т. е. решения одним запросом. Временными таблицами же можно решить любую задачу просто потому, что сегодняшние компьютеры являются алгоритмическими машинами. Однако, не все алгоритмы одинаково полезны.
10
28 сентября 2006 года
Freeman
3.2K / / 06.03.2004
[QUOTE=Freeman]
 
Код:
to_char(prior data_date, 'SSSSS') - to_char(data_date, SSSSS) = 30 * 60 * 100[/QUOTE]
Под Oracle-ом возможна более простая конструкция. Поскольку разность двух дат представляет собой число дней, полчаса можно рассматривать как 1/48 часть дня:
[CODE]data_date - prior data_date = 1/48
385
28 сентября 2006 года
SomewherSomehow
477 / / 25.07.2004
[QUOTE=Freeman]Аргументация понятна, но не принимается. Суть вопроса была прежде всего в том, как выбрать нужные строки, а не как получить разность между датами. Советовать datedif в данном случае - "умный ответ", отписка.
[/QUOTE]
В данном случае это определение направления в котором следует подумать чтобы решить задачу, а не "готовенькое решение", которое многие так любят.
[QUOTE=Freeman]
Временные таблицы превращают СУБД в алгоритмическое средство программирования, что противоречит реляционному взгляду на данные. К сожалению, в большинстве серверов без них не обойтись. Под невозможностью решения я подразумевал отсутствие реляционных средств, т. е. решения одним запросом. Временными таблицами же можно решить любую задачу просто потому, что сегодняшние компьютеры являются алгоритмическими машинами. Однако, не все алгоритмы одинаково полезны.[/QUOTE]
Временная таблица для примера, чтобы попробовать запрос, у меня же нет под рукой той БД с которой работает автор темы... К решению она никакого отношения не имеет...так что прежде чем писать - читаем внимательнее...
21K
29 сентября 2006 года
DIR3ct0r
4 / / 28.09.2006
Ребят.....спасибо за советы. Все вышеперечисленное уже пробывал, но как говорил выше, требуется совместимость со всеми перечисленными СУБД. Принято решение тянуть все простым запросом не большими порциями, а потом обсчитывать постепенно.

Еще раз, спасибо за участие.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог