Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка диапазона  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Доброго времени суток.
СУБД MS SQL Server2005
Пишу курсач на тему ПО для кинотеатра.
Существует таблица сеансов: Seans (IdSeans int, IdFilm int, DateTimeSeans datetime)
Данные в ней
IdSeans int IdFilm int DateTimeSeans datetime
112012-05-04 14:00:00
212012-05-04 16:30:00
322012-05-04 09:00:00
432012-05-04 21:15:00


И таблица фильмов: Film (IdFilm int, NameFilm varchar, Dlitelnost int)
Данные:
IdFilm int NameFilm varchar Dlitelnost int
1Film1100
2Film295
3Film390

Думаю связь этих таблиц ясна.
Задача такова. При добавлении сеанса требуется проверка: свободно ли время для этого сеанса?
как это организовать?
пробовал так
-- вообще параметры передаются из Delphi, здесь задаются для простоты восприятия
DECLARE @TimeSeansN DATETIME, -- дата и время нового сеанса
@DlitelnostN SMALLINT -- длительность нового сеанса
SET @TimeSeansN = '2012-05-04 16:05:00'
SET @DlitelnostN = 100

SELECT *
FROM Seans s
JOIN Film f ON s.IdFilm = f.IdFilm
WHERE (s.DateTimeSeans > (DATEADD(mi,@DlitelnostN,@TimeSeansN))
AND /*пробовал и OR*/ (DATEADD(mi,f.Dlitelnost,s.DateTimeSeans)) < @TimeSeansN)
AND CONVERT(DATETIME, CONVERT(NVARCHAR(10), s.DateTimeSeans, 112)) = CONVERT(DATETIME, CONVERT(NVARCHAR(10), @TimeSeansN, 112) -- определяется дата сеанса

Очевидно, что отрабатывает он, не так как мне нужно.
Я так понимаю, что обычным запросом тут дело не обойдётся и нужен курсор, а вот как его написать, чтобы сравнивались и предыдущие и последующие сеансы - ума не приложу. Подскажите, пожалуйста. Заранее благодарен.

P.S. Данные таблиц писал на вскидку, т.к. при себе нет реальных. Думаю суть вопроса понятна: нужно учитывать и длительности сеансов, и их очерёдность и, конечно же, время начала.
4 май 12, 21:17    [12510761]     Ответить | Цитировать Сообщить модератору
 Re: Выборка диапазона  [new]
iljy
Member

Откуда:
Сообщений: 8711
BuKTaP,

чтож вы все, как до скуля доберетесь, сразу всякую гадость в рот тянете?? Кор-сор, кур-сор, слово-то какое мерзкое!
declare @Seans table (IdSeans int, IdFilm int, DateTimeSeans datetime)
insert @Seans values
(1,	1,	'2012-05-04 14:00:00'),
(2,	1,	'2012-05-04 16:30:00'),
(3,	2,	'2012-05-04 09:00:00'),
(4,	3,	'2012-05-04 21:15:00')

declare @Film table (IdFilm int, NameFilm varchar(100), Dlitelnost int)
insert @Film values
(1,	'Film1',	100),
(2,	'Film2',	95),
(3,	'Film3',	90)


;with cte as
(
	select ROW_NUMBER() over(order by DateTimeSeans) RN,* from @Seans
)
select * from cte t1 join cte t2 on t1.RN+1 = t2.RN

Дальше сами.
4 май 12, 22:11    [12510945]     Ответить | Цитировать Сообщить модератору
 Re: Выборка диапазона  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
declare @TimeSeansN datetime, @DlitelnostN smallint;

select
 @TimeSeansN = '20120504 16:05:00',
 @DlitelnostN = 100;
 
if exists(
 select
  *
 from
  Seans s join
  Film f on s.IdFilm = f.IdFilm
 where
  @TimeSeansN <= dateadd(minute, f.Dlitelnost , s.DateTimeSeans) and 
  dateadd(minute, @DlitelnostN, @TimeSeansN) >= s.DateTimeSeans
 )
 print 'Пересекается'
else
 print 'Не пересекается';
4 май 12, 22:36    [12511004]     Ответить | Цитировать Сообщить модератору
 Re: Выборка диапазона  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
iljy,

а вы определенно потихоньку поддаетесь духу форума. И стали циничней.
4 май 12, 23:41    [12511132]     Ответить | Цитировать Сообщить модератору
 Re: Выборка диапазона  [new]
gr_vl
Member

Откуда: Донецк
Сообщений: 268
SomewhereSomehow,

я извиняюсь но очень часто ставят перед with в CTE точку с запятой
что это означает?
ведь работает вроде и с ней и без «;» одинаково
5 май 12, 00:02    [12511161]     Ответить | Цитировать Сообщить модератору
 Re: Выборка диапазона  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
gr_vl,

http://msdn.microsoft.com/en-us/library/ms175972(v=SQL.105).aspx
When a CTE is used in a statement that is part of a batch, the statement before it must be followed by a semicolon.
5 май 12, 00:16    [12511185]     Ответить | Цитировать Сообщить модератору
 Re: Выборка диапазона  [new]
iljy
Member

Откуда:
Сообщений: 8711
SomewhereSomehow
iljy,

а вы определенно потихоньку поддаетесь духу форума. И стали циничней.

увы мне
5 май 12, 01:06    [12511247]     Ответить | Цитировать Сообщить модератору
 Re: Выборка диапазона  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
gr_vl
SomewhereSomehow,

я извиняюсь но очень часто ставят перед with в CTE точку с запятой
что это означает?
ведь работает вроде и с ней и без «;» одинаково

Это чтобы избежать неоднозначности, что такое with, подсказка в запросе или cte. Вообще, она должна стоять не перед cte, а после последней инструкции перед cte. Вроде как MS вообще обещает сделать ее обязательной после каждой инструкции, но четкую позицию я так и не понял. Жду не дождусь этого веселого дня, когда придется шерстить весь код =)
5 май 12, 09:32    [12511683]     Ответить | Цитировать Сообщить модератору
 Re: Выборка диапазона  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
+
iljy
SomewhereSomehow
iljy,
а вы определенно потихоньку поддаетесь духу форума. И стали циничней.

увы мне
Да ладно. Все мы homo sapiens. Это титанический труд "возвращать себя из колеи" (зашитый в физику мозга), на уровне борьбы с ветряными, особенно когда мозги заняты, или настроение "прекрасное".

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

Другое дело откуда эти курсоры возникают? Дыма без огня ...
От недавних преподов привычки или из-за мышления. Или тотальное насильственное втюхивание императивного мышления преподами со школы.
Личный опыт и убеждения меня расстраивает - что врождённое это. И не поменять (нет контр примеров).

Если ближе к теме. Мне кажется у BuKTaP-а банально не хватает опыта декларативного программирования (ДП) и понимания что императивизм не тотален и не доминирует. Десяток красивейших, гениально простых и универсальных примеров на ДП и "загорится идеей" как пить дать. А далее придёт понимание что к чему.

КО
5 май 12, 21:13    [12515715]     Ответить | Цитировать Сообщить модератору
 Re: Выборка диапазона  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Всем спасибо, и циникам и не очень :)
Проблема решена по методу invm. Ему отдельная благодарность. Когда увидел решение сам себе усмехнулся, что сравнивал чуть не то, что нужно.
7 май 12, 16:03    [12520578]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить