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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2011, 11:35   #1
MrBobyara
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 28
По умолчанию Не могу разобратся с датами

Ни как не получается придумать формулу.
допустим так, сейчас предмет вернули из использования, есть период несколько дней когда им никто не пользуется, но чуть дальше на него стоит бронь.
например:
взят 10.03.11 до 01.04.11 --предмет не занят-- бронь 10.04.11 до хх.хх.хх
как мне определить что вот тут --предмет не занят-- он свободен и его можно брать.
Делаю в oracle
Буду благодарен за помощь !

Последний раз редактировалось MrBobyara; 02.04.2011 в 11:51.
MrBobyara вне форума Ответить с цитированием
Старый 02.04.2011, 16:07   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

not exists .... databegin <testdate and testdate<datefin
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.04.2011, 22:25   #3
MrBobyara
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 28
По умолчанию

но даты у меня всего две, что запомнить в дату testdate ?
MrBobyara вне форума Ответить с цитированием
Старый 03.04.2011, 07:58   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

вместо testdate должно быть
Цитата:
как мне определить что вот тут
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.04.2011, 19:34   #5
MrBobyara
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 28
По умолчанию

Не получается все равно.
вот, что б наглядней было.

ID sdate fdate
--- -------- --------
1 01.04.11 07.04.11 -- использовался --
1 15.04.11 20.04.11 -- Забронирован --

как мне определить что между этими датами его можно использовать
MrBobyara вне форума Ответить с цитированием
Старый 13.04.2011, 12:40   #6
Evgen1503
Пользователь
 
Регистрация: 02.05.2009
Сообщений: 42
По умолчанию

Может вот так
select max(fdate)
from table
where fdate<=Date1

и

select min(Sdate)
from table
where Sdate>=Date1

в промежуток между max и min можно использовать если они не равны
Evgen1503 вне форума Ответить с цитированием
Старый 13.04.2011, 13:01   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

если интересно самому разобраться, а не получить готовое решение (тем более что ничего толкового пока никто не предложил), то сходи на скл.ру в подфорум оракл - там поиском по ключевым словам "дырка", "интервал" найдешь полезные решения
soleil@mmc вне форума Ответить с цитированием
Старый 13.04.2011, 15:47   #8
MrBobyara
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 28
По умолчанию

Спасибо за советы.
MrBobyara вне форума Ответить с цитированием
Старый 14.04.2011, 09:51   #9
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

вот вариант решения для твоего случая (хотя реальность точно будет сложнее)
имена полей поправишь на свои

Код:
with
  t as (
  select 1 id, to_date('01.04.2011', 'DD.MM.YYYY') date_from, to_date('07.04.2011', 'DD.MM.YYYY') date_to from dual union all
  select 1, to_date('15.04.2011', 'DD.MM.YYYY'), to_date('20.04.2011', 'DD.MM.YYYY') from dual
  )
  
select * 
from (
  select 
    date_to + 1 d_begin, 
    lead(date_from) over (order by date_from) - 1 d_end 
  from t) 
where d_begin < d_end
апд
уточнение для варианта нахождения "дырки" в один день
Код:
with
  t as (
  select 1 id, to_date('01.04.2011', 'DD.MM.YYYY') date_from, to_date('07.04.2011', 'DD.MM.YYYY') date_to from dual union all
  select 1, to_date('15.04.2011', 'DD.MM.YYYY'), to_date('20.04.2011', 'DD.MM.YYYY') from dual union all
  select 1, to_date('25.04.2011', 'DD.MM.YYYY'), to_date('27.04.2011', 'DD.MM.YYYY') from dual union all
  select 1, to_date('22.04.2011', 'DD.MM.YYYY'), to_date('23.04.2011', 'DD.MM.YYYY') from dual
  )
  
select * 
from (
  select 
    date_to + 1 d_begin, 
    lead(date_from) over (order by date_from) - 1 d_end 
  from t) 
where d_begin <= d_end

Последний раз редактировалось soleil@mmc; 14.04.2011 в 15:12.
soleil@mmc вне форума Ответить с цитированием
Старый 14.04.2011, 17:20   #10
MrBobyara
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 28
По умолчанию

Спасибо огромное, пример полезный, но для моего случая я нашел решение как раз то проще. Ну ничего этот тоже на будущее пригодится !
Еще раз спасибо !

тему можно закрывать.
MrBobyara вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу разобратся с primary key Progsenya SQL, базы данных 3 19.02.2011 10:27
не могу разобратся с "ЕСЛИ", Формула/Макрос? VoroniN2010 Microsoft Office Excel 2 23.09.2010 10:26
не могу разобратся с TreeView L11L Помощь студентам 5 29.04.2010 11:20
Не могу разобратся с постусловием ArteMAN Паскаль, Turbo Pascal, PascalABC.NET 8 23.04.2010 23:28
Помогите разобратся!!! rex2003 Свободное общение 1 18.02.2007 20:37