请教高手呀--创建影厅信息表(cinemaInfo)
create table cinemaInfo
(
 cid number primary key,--编号
 cname varchar2(10) not null, --影厅名称
 re varchar2(50)
);
--电影信息表(filmInfo) 
create table filmInfo
(
 fid number primary key,--编号
 fname varchar2(20) not null,--电影名称
 director varchar2(20) not null,--导演
 starring varchar2(20) not null,--主演
 style varchar2(20) not null,--类型
 flanguage varchar2(20) not null,--语言
 fdate date not null,--上映日期(电影首映日期)
 length number not null,--片长(电影所播放的长度) 单位:分钟
 price number(4,1) not null,--价格
 image varchar2(50) not null,--图片
 drama varchar2(100),--剧情
 critic varchar2(50) --一句话影评
);--影片上映时间表(release)
create table release
(
 rid number primary key,--上映时间表编号
 fid number references filmInfo(fid),--电影编号(外键)
 cid number references cinemaInfo(cid),--所要播放的影厅编号(外键)
 rdate date not null,--上映日期
 rtime date not null --上映时间
);--创建序列
create sequence cinemaInfo_seq;
create sequence filmInfo_seq;
create sequence release_seq;insert into cinemainfo values(cinemaInfo_seq.Nextval,'一号影厅','一号影厅');
insert into cinemainfo values(cinemaInfo_seq.Nextval,'二号影厅','二号影厅');
insert into cinemainfo values(cinemaInfo_seq.Nextval,'三号影厅','三号影厅');insert into filmInfo values(filmInfo_seq.Nextval,'钢铁侠2','乔恩法弗罗','小罗伯特唐尼','科幻','英语','2010-06-01','90','65','/upload/gg.jpg','','');
insert into filmInfo values(filmInfo_seq.Nextval,'叶问2','冯晓刚','甄子丹','动作片','国语','2010-06-01','90','65','/upload/yy.jpg','','')
一部影片播放完后,到下一部影片开始  中途清场时间间隔 30分钟insert into release values(release_seq.nextval,1,1,to_date('2010-06-01','yyyy-MM-dd'),to_date('2010-06-01 19:30','yyyy-MM-dd hh24:mi'));
insert into release values(release_seq.nextval,1,1,to_date('2010-06-01','yyyy-MM-dd'),to_date('2010-06-01 21:30','yyyy-MM-dd hh24:mi'));release表数据如下:
rid  fid  cid    rdate           rtime
--- ----  ---    -----     -------------------
1     1    1   2010-06-01  2010-06-01 19:30:00
2     1    1   2010-06-01  2010-06-01 21:30:00现在想将叶问2加入档期 该电影编号为2
用户选择的 影厅编号1 电影编号2 日期选择 2010-06-01 时间也可以选择
我想判断 该影片(叶问2) 在该影厅(编号1) 该日期(2010-06-01) 是否能在选择的时间 上映?
比如在2010-06-01 17:30 到 2010-06-01 23:30 之间是不能加入档期的

解决方案 »

  1.   

    --SQL的:/*
    --创建影厅信息表(cinemaInfo)
    create table cinemaInfo
    (
     cid INT IDENTITY primary key,--编号
     cname varchar(10) not null, --影厅名称
     re varchar(50)
    );
    --电影信息表(filmInfo) 
    create table filmInfo
    (
     fid int identity primary key,--编号
     fname varchar(20) not null,--电影名称
     director varchar(20) not null,--导演
     starring varchar(20) not null,--主演
     style varchar(20) not null,--类型
     flanguage varchar(20) not null,--语言
     fdate date not null,--上映日期(电影首映日期)
     [length] int not null,--片长(电影所播放的长度) 单位:分钟
     price dec(4,1) not null,--价格
     [image] varchar(50) not null,--图片
     drama varchar(100),--剧情
     critic varchar(50) --一句话影评
    );--影片上映时间表(release)
    create table release
    (
     rid INT identity primary key,--上映时间表编号
     fid int references filmInfo(fid),--电影编号(外键)
     cid int references cinemaInfo(cid),--所要播放的影厅编号(外键)
     rdate datetime not null,--上映日期
     rtime datetime not null --上映时间
    );
    insert into cinemainfo values('一号影厅','一号影厅');
    insert into cinemainfo values('二号影厅','二号影厅');
    insert into cinemainfo values('三号影厅','三号影厅');insert into filmInfo values('钢铁侠2','乔恩法弗罗','小罗伯特唐尼','科幻','英语','2010-06-01','90','65','/upload/gg.jpg','','');
    insert into filmInfo values('叶问2','冯晓刚','甄子丹','动作片','国语','2010-06-01','90','65','/upload/yy.jpg','','')insert into release values(1,1,'2010-06-01','2010-06-01 19:30');
    insert into release values(1,1,'2010-06-01','2010-06-01 21:30');
    */
    --SELECT * FROM cinemaInfo ci
    --SELECT * FROM filmInfo fi
    --SELECT * FROM release r
    IF OBJECT_ID('[p_test]') IS NOT NULL
        DROP PROC [p_test]
    GO
    CREATE PROC [p_test]
        @电影名 varchar(100),
        @影厅名 varchar(100),
        @放映时间 datetime
    AS
    IF EXISTS(
           SELECT 1 
           FROM filmInfo a
               JOIN cinemaInfo b
                   ON  a.fname = @电影名
                       AND b.cname = @影厅名
                       AND EXISTS(
                               SELECT * 
                               FROM release m
                                   JOIN filmInfo n
                                       ON  m.fid = n.fid
                               WHERE m.cid = b.cid
                                   AND (
                                               DATEADD(mi, a.[length]+30, @放映时间) BETWEEN rtime AND DATEADD(mi, n.[length]+30, rtime) 
                                           OR  @放映时间 BETWEEN rtime AND DATEADD(mi, n.[length]+30, rtime)
                                       )
                           )
           )
        SELECT '在此时间不能放映' AS 状态
    ELSE 
        SELECT '在此时间可以放映' AS 状态
    GO
    EXEC [p_test] '叶问2','一号影厅','2010-06-01 19:30:00'
    /*
    状态
    ----------------
    在此时间不能放映(1 行受影响)
    */
    EXEC [p_test] '叶问2','二号影厅','2010-06-01 19:30:00'
    /*
    状态
    ----------------
    在此时间可以放映(1 行受影响)
    */EXEC [p_test] '叶问2','一号影厅','2010-06-01 17:29:00'
    /*
    状态
    ----------------
    在此时间可以放映(1 行受影响)
    */EXEC [p_test] '叶问2','一号影厅','2010-06-01 17:30:00'
    /*
    状态
    ----------------
    在此时间不能放映(1 行受影响)
    */EXEC [p_test] '叶问2','一号影厅','2010-06-01 23:30:00'
    /*
    状态
    ----------------
    在此时间不能放映(1 行受影响)
    */
    EXEC [p_test] '叶问2','一号影厅','2010-06-01 23:31:00'
    /*
    状态
    ----------------
    在此时间可以放映(1 行受影响)
    */
      

  2.   

    --再插入两条测试数据参与测试,修正一下刚刚发现的BUG
    --创建影厅信息表(cinemaInfo)
    create table cinemaInfo
    (
     cid INT IDENTITY primary key,--编号
     cname varchar(10) not null, --影厅名称
     re varchar(50)
    );
    --电影信息表(filmInfo) 
    create table filmInfo
    (
     fid int identity primary key,--编号
     fname varchar(20) not null,--电影名称
     director varchar(20) not null,--导演
     starring varchar(20) not null,--主演
     style varchar(20) not null,--类型
     flanguage varchar(20) not null,--语言
     fdate date not null,--上映日期(电影首映日期)
     [length] int not null,--片长(电影所播放的长度) 单位:分钟
     price dec(4,1) not null,--价格
     [image] varchar(50) not null,--图片
     drama varchar(100),--剧情
     critic varchar(50) --一句话影评
    );--影片上映时间表(release)
    create table release
    (
     rid INT identity primary key,--上映时间表编号
     fid int references filmInfo(fid),--电影编号(外键)
     cid int references cinemaInfo(cid),--所要播放的影厅编号(外键)
     rdate datetime not null,--上映日期
     rtime datetime not null --上映时间
    );
    insert into cinemainfo values('一号影厅','一号影厅');
    insert into cinemainfo values('二号影厅','二号影厅');
    insert into cinemainfo values('三号影厅','三号影厅');insert into filmInfo values('钢铁侠2','乔恩法弗罗','小罗伯特唐尼','科幻','英语','2010-06-01','90','65','/upload/gg.jpg','','');
    insert into filmInfo values('叶问2','冯晓刚','甄子丹','动作片','国语','2010-06-01','90','65','/upload/yy.jpg','','')
    ---插入1-----------------------------------------
    insert into filmInfo values('变形金钢2','乔恩法弗罗','小罗伯特唐尼','科幻','英语','2010-06-01','90','65','/upload/gg.jpg','','');
    -------------------------------------------------
    insert into release values(1,1,'2010-06-01','2010-06-01 19:30');
    insert into release values(1,1,'2010-06-01','2010-06-01 21:30');
    ----插入2-----------------------------------------
    insert into release values(3,1,'2010-06-01','2010-06-01 23:50');
    ---------------------------------------------------
    */
    --SELECT * FROM cinemaInfo ci
    --SELECT * FROM filmInfo fi
    --SELECT * FROM release r
    IF OBJECT_ID('[p_test]') IS NOT NULL
        DROP PROC [p_test]
    GO
    CREATE PROC [p_test]
    @电影名 varchar(100),
    @影厅名 varchar(100),
    @放映时间 datetime
    AS
    IF EXISTS(
           SELECT 1 
           FROM filmInfo a
            JOIN cinemaInfo b
            ON  a.fname = @电影名
                AND b.cname = @影厅名
                AND EXISTS(
                        SELECT * 
                        FROM release m
                         JOIN filmInfo n
                         ON  m.fid = n.fid
                        WHERE m.cid = b.cid
            AND m.fid<>a.fid
                         AND (
                         DATEADD(mi, a.[length]+30, @放映时间) BETWEEN rtime AND DATEADD(mi, n.[length]+30, rtime) 
                         OR  @放映时间 BETWEEN rtime AND DATEADD(mi, n.[length]+30, rtime)
                         )
                    )
       )
        SELECT '在此时间不能放映' AS 状态
    ELSE 
    SELECT '在此时间可以放映' AS 状态
    GO
    EXEC [p_test] '钢铁侠2','一号影厅','2010-06-02 1:30:00'
    /*
    状态
    ----------------
    在此时间不能放映(1 行受影响)
    */
    EXEC [p_test] '叶问2','一号影厅','2010-06-01 15:31:00'
    /*
    状态
    ----------------
    在此时间可以放映(1 行受影响)
    */
      

  3.   

    是oracle的就好了,真的要谢谢htl258这位兄台,我看这个存储过程都看得稀里糊涂的,呵呵
    我会马上结贴的