Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2012, 22:59   #1
Raz0r
Пользователь
 
Регистрация: 06.11.2007
Сообщений: 47
Вопрос Поиск подряд идущих дат

Всем привет, появилась довольно интересная задача: определить промежутки между подряд идущими датами, например:
Код:
26.10.2012
29.10.2012
30.10.2012
31.10.2012
02.11.2012
Результат
Дата         | Пропущенные дни
26.10.2012 | 2
31.11.2012 | 1
Есть, конечно, решение в лоб, путём создания большого количества вложенных запросов или написания процедур, но хотелось бы узнать, может есть какое-нибудь более изящное решение. Заранее спасибо.
Raz0r вне форума Ответить с цитированием
Старый 27.10.2012, 23:33   #2
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

А не сложно объявить об используемой СУБД?
Опять же, где это нашлись "подряд идущие" даты, если известно, что в SQL СУБД полагаться на желаемый порядок записей в таблицах - дело ненадежное, а точнее сказать, дохлое?
Если, конечно, это одна из скулевских СУБД.
Karabash вне форума Ответить с цитированием
Старый 27.10.2012, 23:58   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если даты без времени начать, например, с такого
Код:
SELECT T1.date1,(SELECT MIN(T2.date1) FROM MyTable T2 WHERE T2.date1>T1.date1) AS NextDate
  FROM MyTable T1
А дальше можно найти требуемые интервалы, учесть, что в одной или нескольких записей выборки NextDate будет NULL
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.10.2012 в 00:38.
Аватар вне форума Ответить с цитированием
Старый 28.10.2012, 00:07   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Raz0r
Некоторые тяжелые СУБД имеют в своем запасе аналитические и рекурсивные механизмы обработки данных, позволяющие решить подобные твоей задачи, так что указывай СУБД
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.10.2012, 00:13   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не думаю, что рекурсии здесь уместны
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.10.2012, 00:16   #6
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Запрос Аватара работает совсем неплохо, но без сортировки этот пример обречен на ошибки.
Впрочем, добавить три слова к запросу - дело немудреное.
Karabash вне форума Ответить с цитированием
Старый 28.10.2012, 00:18   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Без сортировки ваш пример, Аватар, обречен на ошибки
Каким образом, подробнее
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.10.2012, 00:25   #8
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Ну, тут просто. Если некоторые записи были созданы не в хронологии по этим самым записываемым датам, то в поле NextDate будут не всегда правильные даты.
Я сейчас проверил и точно - так и получается.
Стоило добавить order by Dt и результат уже выглядел гармонично от начала и до конца выборки (в тестирование принимали 470 записей, где были даты).
А получить разность между датами в днях - дело техники. Зависит, правда, от СУБД. А ТС воды в рот набрал.
Karabash вне форума Ответить с цитированием
Старый 28.10.2012, 00:31   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Если речь идет о хронологии создания и интервалы мерять именно в этом смысле, то этот запрос ничего не решит, хоть с сортировкой, хоть без неё. Тогда какие-то спец средства СУБД, учитывающие хронологию физического создания записей, если таковые вообще имеются. В MS SQL, например, я таких средств не встречал. Запрос чуть подправил, описка была date2
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.10.2012 в 00:39.
Аватар вне форума Ответить с цитированием
Старый 28.10.2012, 00:41   #10
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

А почему "не решит"? Практика говорит об обратном. Протестил. Вроде, выборка как надо складывается. Только с сортировкой. Если это не совпадение. Но совпадение на почти 500 записей...

----
Внимательнее посмотрел. Запрос верно все показывает. Что с сортировкой, что без. Потому как выборка второй даты идет от той, которая выбрана в текущей записи.
Так что запрос вполне работоспособен и именно в таком виде.
Можно, верно, найти еще методы, но этот прост и понятен "как три рубля".
+

Последний раз редактировалось Karabash; 28.10.2012 в 00:54.
Karabash вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Количество идущих подряд символов hamsidJ Общие вопросы по Java, Java SE, Kotlin 4 27.01.2013 04:55
найти максимальное число пробелов идущих подряд angelochek7 Помощь студентам 0 08.05.2012 21:42
Объединение подряд идущих сообщений от одного пользователя Obey-Kun О форуме и сайтах клуба 5 04.02.2011 17:46
минимальная сумма подряд идущих чисел (паскаль) grom333 Помощь студентам 7 15.01.2011 03:03
Задача о шести подряд идущих единицах. llTibegll Помощь студентам 11 06.11.2009 10:04