字段 人员id,begintime,endtime
数据  A   ,2007-12-24 00:00:00,2007-12-28 23:59:00
数据  A   ,2007-01-01 00:00:00,2007-01-02 23:59:00表中已有人员A需要出差,出差时间在2007-12-24 00:00:00 到 2007-12-28 23:59:00
问题:如果我还要添加人员A的记录,那么A就不在之前的所有时间段内出差这个判断怎么写,数据库sql20005 开发环境vs 2008 .net 2.0
求高手解决

解决方案 »

  1.   

    select top 1 from 表 where id=’A' order by endtime DESC ,beginTime DESC
    这样选出来的就是结束时间最晚,开始时间最晚的一次出差
      

  2.   

    1种方法先delect table where 人员id='A' ,然后添加
    2种方法先 update table set begintime=null , endtime=null where 人员id='A',然后添加
    注释:必要时可以把begintime 字段和endtime字段改为varchar
      

  3.   

    先把A人员的记录放到一个临时表
    把人员A新增记录的时间进行比较
    新增记录的时间为@BeginTime,@EndTime
    如果临时表内不存在
    (@BeginTime>begintime and @beginTime<EndTime) or
    (@EndTime>begintime and @EndTime<endTime)的数据
    即可以插入
      

  4.   

    nosuchtracter 
    这是我之前写的一个语句
    select * from tblEvectionReport 
    where EmployeeID='dengxueying' 
    and evectionbegintime>='2008-12-10' and evectionbegintime<='2008-12-30'
    and EvectionEndTime>='2008-12-10' and EvectionEndTime<='2008-12-30'这样我记得好像不行,如果是同一个时间段,数据还是能插进去
      

  5.   

    sql去获取这个人员所有的出差记录,然后在程序逻辑里面去判断比较方便吧;
    逻辑就是(@BeginTime> begintime   and   @beginTime <EndTime)   or 
    (@EndTime> begintime   and   @EndTime <endTime)这样的
      

  6.   

    假如你要插入的数据是:开始时间:start ,结束时间:end
    那首先要选出他已有的出差记录吧?
    用select   top   1   from   表   where   id=’A'   order   by   endtime   DESC   ,beginTime   DESC if(start between  数据库开始时间 and 数据库结束时间)
    {
    //那么就不能插入,直接返回
    }
    else if(end between  数据库开始时间 and 数据库结束时间)
    {
     //不能插入
    }
    else
    {
    //插入
    }这样不行?
      

  7.   

    zhuanshen712 
    问题在于A可以有n个在不同时间段内出差记录!!
      

  8.   

    你的意思是原表中已经记录了 a 的几个段时间,比如:
    2007-1-1 --- 2007-1-10
    2007-12-1 --- 2007-12-10
    有这两个段时间.那么,比如你现在要新插 2007-5-1  --- 2007-5-10 是允许的.也即,你是希望程序来检测你要插入的这个数据是否允许?那么你要传的参数是什么? 将 @begintime,@endtime放进去,然后 如果合法,则插入并返回true,若不合法,则不插入并返回false ?
      

  9.   

    别哭,把一千分给我吧。
    我想你可以试试:
    不是要插入数据吗?插入的开始时间(start)和结束时间(end)必须要不在以前的记录中是吗?
    这样:
    "select * from 表 where id=‘A’ and begintime<='"+start+"' and endtime >='"+start"'";
    这样的话就是说:看插入的时间在不在以前出差的时间段中,如果能选出记录的话,那么很显然,这个时间是不能出差的。
    同样的道理解决endtime。
    你看行不行?
      

  10.   

    if(Ds.rows.count>0)
    {
    //不能插入。
    }
    else
    {
    //能插入。
    }
      

  11.   


    错了,应该是:
    “select * from 表 where id='A' and (starttime<='"+插入的开始时间+"' and Endtime >='"+插入的开始时间+"'")or (startTime>='"+插入的开始时间+"' and starttime<='"+插入的结束时间+"') or (starttime<='"+插入的开始时间+ "' and endtime<='”+插入的结束时间)
    大概意思就是说:
     插入的时间间隔在以上三种情况是不能插入到数据库中的。
    根据这个意思,查询符合条件的记录,如果能找到记录说明不能插入到数据库中。
    sql语句不对,表达个意思就行了。
      

  12.   

    INSERT tb (person,startTime,endTime)
    SELECT a.* FROM 
    (SELECT 'a',@beginTime bTime,@endTime eTime) a
    WHERE NOT EXISTS(
    SELECT 1 FROM tb
    WHERE bTime BETWEEN beginTime AND EndTime
    OR
    eTime BETWEEN beginTime AND EndTime
    /*OR
    EndTime BETWEEN bTime AND eTime
    OR
    beginTime BETWEEN bTime AND eTime*/
    )
    IF @@ROWCOUNT=0
    --返回false
    ELSE
    --返回true
      

  13.   

    问题解决!!!感谢!!
    鸣谢!zhuanshen712 ,fcuandy hy_lihuan