Есть таблица состоящая из некторых столбцов (дата, масса, плотность и т.д.).
Столбец дата имеет формат Datetime "2002-08-09 13:00:00".
Необходимо выбрать все записи, в которых разница составиляет более 20 секунд.
Например:
2002-08-09 13:00:00
2002-08-09 13:00:34
2002-08-09 13:00:45
2002-08-09 13:01:00
2002-08-09 13:01:13
Т.е. должна получиться следующая таблица:
Начало | Конец
2002-08-09 13:00:00 | 2002-08-09 13:00:34
2002-08-09 13:00:45 | 2002-08-09 13:00:13
Помогите, пожалуйста, напистать грамотный запрос.
[SQL] Попутный вопрос05.05.03 19:00 Автор: vh <Дмитрий> Статус: Member
> А как например если такая ситуация: > есть запрос: > SELECT dt, name, comment FROM guestbook ORDER BY dt DESC > > но хочется чтобы были приняты не все записи, а лишь начиная > с n-ой по k-тою (именно из этого запроса) > > можно ли это сделать с помощью SQL? если нет, то как это > сделать через php? К сожалению, переносимого способа сделать это через SQL, похоже, нет. Более или менее "переносимо", то есть не привязываясь к конкретному серверу SQL, это можно сделать через курсоры.
[SQL] Работа с датами, запрос05.05.03 10:27 Автор: Sandy <Alexander Stepanov> Статус: Elderman
> > Есть таблица состоящая из некторых столбцов (дата, > масса, > > плотность и т.д.). > > Столбец дата имеет формат Datetime "2002-08-09 > 13:00:00". > > А если этот столбец раскидать на два с типами дата и время, > а потом ставить условие с вычитанием?
Так не получится, я пробывал.
А запрос имеет примерно такой вид:
select * from table a, table b where second(b.date_enter)+60*(((minute(b.date_enter)+60*(hour(b.date_enter)-hour(a.date_enter)))-minute(a.date_enter)))-second(a.date_enter)>20;
В результате записи выбераются следующим образом:
Начало | Конец
2002-08-09 13:00:00 | 2002-08-09 13:00:34
2002-08-09 13:00:00 | 2002-08-09 13:00:45
2002-08-09 13:00:00 | 2002-08-09 13:01:00
2002-08-09 13:00:00 | 2002-08-09 13:01:13
2002-08-09 13:00:34 | 2002-08-09 13:01:00
2002-08-09 13:00:34 | 2002-08-09 13:01:13
2002-08-09 13:00:45 | 2002-08-09 13:01:13
А нужно чтоб было:
Начало | Конец
2002-08-09 13:00:00 | 2002-08-09 13:00:34
2002-08-09 13:00:45 | 2002-08-09 13:00:13
имхо на ANSI SQL - Никак, только с помощью ф-ий.05.05.03 11:47 Автор: PS <PS> Статус: Elderman
> см. доки PL/SQL, MSSQL Причем тут сортировка.
В результате записи выбераются следующим образом:
Начало | Конец
2002-08-09 13:00:00 | 2002-08-09 13:00:34
2002-08-09 13:00:00 | 2002-08-09 13:00:45
2002-08-09 13:00:00 | 2002-08-09 13:01:00
2002-08-09 13:00:00 | 2002-08-09 13:01:13
2002-08-09 13:00:34 | 2002-08-09 13:01:00
2002-08-09 13:00:34 | 2002-08-09 13:01:13
2002-08-09 13:00:45 | 2002-08-09 13:01:13
А нужно чтоб было:
Начало | Конец
2002-08-09 13:00:00 | 2002-08-09 13:00:34
2002-08-09 13:00:45 | 2002-08-09 13:00:13
<отв
Так примени к своиму результату инструкцию, которая убирает повторающинся записи - и будет тебе то что надо.
P.S. а я бы написал ф-ию ;))
1. Взять первую запись (или ту на которую указывает курсор)
2. Пробежатся по остальным записям
3. Для каждой сделать вычисление, подходящие поместить во временное хранилище.
4. Сместить курсор, вернутся на п.1
P.S. Кстати, я не понял, что такое "Начало | Конец" Это у тебя два поля (???) или ты просто так весь вывод отформатировал ?
Если два поля - тогда совсем ничего не понятно:
> 2002-08-09 13:00:00 | 2002-08-09 13:00:34 > 2002-08-09 13:00:45 | 2002-08-09 13:00:13 А почему например не
2002-08-09 13:00:00 | 2002-08-09 13:00:34
2002-08-09 13:00:13 | 2002-08-09 13:00:45
> > см. доки PL/SQL, MSSQL > Причем тут сортировка. > В результате записи выбераются следующим образом: > Начало | Конец > 2002-08-09 13:00:00 | 2002-08-09 13:00:34 > 2002-08-09 13:00:00 | 2002-08-09 13:00:45 > 2002-08-09 13:00:00 | 2002-08-09 13:01:00 > 2002-08-09 13:00:00 | 2002-08-09 13:01:13 > 2002-08-09 13:00:34 | 2002-08-09 13:01:00 > 2002-08-09 13:00:34 | 2002-08-09 13:01:13 > 2002-08-09 13:00:45 | 2002-08-09 13:01:13 > А нужно чтоб было: > Начало | Конец > 2002-08-09 13:00:00 | 2002-08-09 13:00:34 > 2002-08-09 13:00:45 | 2002-08-09 13:00:13 > <отв
Дык,05.05.03 13:30 Автор: Maksim Статус: Незарегистрированный пользователь
Т.е. новое начало периода времени всегда должно быть больше предыдущего.
Существует ли какие-нибудь команды которые переключают указатель записей в БД (типа Next, Record, как в FoxPro).
А если результат выборки твоего запроса сгруппировать по полю Date_Begin?05.05.03 16:52 Автор: Sandy <Alexander Stepanov> Статус: Elderman
Формализованно звучит так:
Есть одномерный массив [N]. Необходимо создать двумерный массив [M,K], такой, что ( (Ki - Mi) > 20 ) AND Ki > M(i-1), где M и K принадлежат N.
В условии появились индексы i, i-1 - отсюда, задача с помощью ANSI SQL не решается.
Во первых, SQL ничего не знает о порядке следования записей. next, prev, first, last - это все термины курсоров (см. PL/SQL, MSSQL, ODBC, OLEDB, CRecordset, etc. )
Во вторых, SQL не имеет механизма "памяти", поэтому указать в условии выборки Ki > M(i-1) - невозможно.
Пиши процедуры, либо хранимые на сервере, либо клиентские.
P.S. хотя давненько за сиквел не держался, так что если "старшие" товарищи докажут, что задача решаема - с удовольствием почитаю.
> Есть таблица: > Date_enter | Massa | Press | > 2002-08-09 13:00:00 | 10 | 0.5 | > 2002-08-09 13:00:34 | 13 | 0.1 | > 2002-08-09 13:00:45 | 9 | 0.2 | > 2002-08-09 13:01:00 | 11 | 0.9 | > 2002-08-09 13:01:13 | 18 | 0.7 | > > Нужно получить новую таблицу: > Date_Begin | Date_End | > Min_Massa | Min_Press | > 2002-08-09 13:00:00 | 2002-08-09 13:00:34 | 10 > | 0.1 | > 2002-08-09 13:00:45 | 2002-08-09 13:01:13 | 9 > | 0.2 | > > Т.е. новое начало периода времени всегда должно быть больше > предыдущего. > Существует ли какие-нибудь команды которые переключают > указатель записей в БД (типа Next, Record, как в FoxPro).