select * from mytable where
datediff(mi,DateField1,DateField2)>30
Запрос SQL, возможно ли
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
подскажите пожалйуста...
Код:
Соответсвенно поищи в справке к своей субд, наверняка есть что-то подобное...
По-моему, только если сервер поддерживает иерархические зависимости, ключевые слова: connect by и start with.
[QUOTE=SomewherSomehow]Возможно. Почему-то опять не указана бд. Например в mssql есть такая функция:
Код:
select * from mytable where
datediff(mi,DateField1,DateField2)>30
datediff(mi,DateField1,DateField2)>30
Пример не соответствует задаче - datediff вычисляет разницу между полями, тогда как тут требуется разность между строками.
Перечисленные выше штампы времени являются значениями атрибута 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...
Цитата:
Пример не соответствует задаче - datediff вычисляет разницу между полями, тогда как тут требуется разность между строками.
совершенно верно :(
Если в кратце, то суть следующая.....в таблице данные разбиты по получасовкам, т.е в сутки 48 получасовок....необходимо определить дыры между получасовками, чтобы заполнить их нулевыми значениями.
Можно конечно выбирать все получасовки и сравнивать в цикле, но данных очень много и результат такого запроса займет ну просто умопомрачительный размер памяти.
Для 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
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
Говорить что datediff вычисляет разницу между полями - всеравно что говорить "маркером можно писать только на бумаге"...у тебя есть инструмент а уж как ты его используешь - другой вопрос. datediff - прежде всего считает разность между двумя датами...а в примере это просто проиллюстрировано...
[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)
)
)
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)
)
)
единственное что, это последнее значение не будет попадать в выборку, но и это можно обойти условием в запросе...было бы желание...
Аргументация понятна, но не принимается. Суть вопроса была прежде всего в том, как выбрать нужные строки, а не как получить разность между датами. Советовать datedif в данном случае - "умный ответ", отписка.
[QUOTE=SomewherSomehow]и совсем не обязательно:[/QUOTE]
Временные таблицы превращают СУБД в алгоритмическое средство программирования, что противоречит реляционному взгляду на данные. К сожалению, в большинстве серверов без них не обойтись. Под невозможностью решения я подразумевал отсутствие реляционных средств, т. е. решения одним запросом. Временными таблицами же можно решить любую задачу просто потому, что сегодняшние компьютеры являются алгоритмическими машинами. Однако, не все алгоритмы одинаково полезны.
Код:
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
Под Oracle-ом возможна более простая конструкция. Поскольку разность двух дат представляет собой число дней, полчаса можно рассматривать как 1/48 часть дня:
[CODE]data_date - prior data_date = 1/48
[/QUOTE]
В данном случае это определение направления в котором следует подумать чтобы решить задачу, а не "готовенькое решение", которое многие так любят.
[QUOTE=Freeman]
Временные таблицы превращают СУБД в алгоритмическое средство программирования, что противоречит реляционному взгляду на данные. К сожалению, в большинстве серверов без них не обойтись. Под невозможностью решения я подразумевал отсутствие реляционных средств, т. е. решения одним запросом. Временными таблицами же можно решить любую задачу просто потому, что сегодняшние компьютеры являются алгоритмическими машинами. Однако, не все алгоритмы одинаково полезны.[/QUOTE]
Временная таблица для примера, чтобы попробовать запрос, у меня же нет под рукой той БД с которой работает автор темы... К решению она никакого отношения не имеет...так что прежде чем писать - читаем внимательнее...
Еще раз, спасибо за участие.