不用建触发器﹐你把state字段設置成公式就可以了

解决方案 »

  1.   

    --state可以直接用公式create table 表名(
    card int,
    time1 datetime,
    time2 datetime,
    state as case when time1>time2 then N'出' else N'入' end
    )
      

  2.   

    create table 表名(
    card int,
    time1 datetime,
    time2 datetime,
    state as case when time1>time2 then N'出' else N'入' end
    )
      

  3.   

    30分钟内不接收新数据  是指time1或者time2的相邻两行的数据至少要有30分钟的时间,这样保证30分钟内一个人不会重复考勤。下一条记录来时,如果跟前面的记录相隔没有30分钟,就不插入表,如果大于30分钟就插入表。time1和time2是两个考勤点获得的时间数据,1比2大   说明是出,1比2小  说明是入。就是这个意思,选用触发器就是得到一个数据时触发,并比较,符合条件就产生一行记录新的时间,不符合条件就保持原来数据不变。
      

  4.   

    30分钟内也将不再接收新的数据,SQL SERVER 应该还做不到.....
      

  5.   

    除非你把SQL SERVER 停了..呵呵..
      

  6.   

    可以用触发器实现,但sqlserver的触发器只是语句级别的,不能类似Oracle那样达到
    行级别,所以应用起来比较麻烦。
        原理:使用Update After触发器,
                 用游标遍历表中所有数据,对每一条记录进行如下判别
              1、判断time1是否大于time2 如果满足条件用系统时间和time1比较,查看
                 是否已经超过30分钟,如果没有超过30分钟,就抛出异常,中断退出
              2、判断time2是否大于time1 如果满足条件用系统时间和time2比较,查看
                 是否已经超过30分钟,如果没有超过30分钟,就抛出异常,中断退出
      

  7.   

    --sql毕竟不是vfp数据库,它没有记录号,也没有记录顺序的概念
    --所以与上一条数据进行比较的说法本来就有问题--如果是变通一下,只要插入的数据与表中现有的数据的time1或time2相差>=30分钟就插入
    --可以这样写处理的触发器
    create trigger tr_insert on 表名
    instead of insert
    as
    insert 表名(card,time1,time2,state)
    select card,time1,time2
    ,state=case when time1>time2 then N'出' else N'入' end
    from inserted i
    where not exists(
    select * from 表名
    where card=a.card
    and datediff(minute,time1,a.time1)<30
    and datediff(minute,time1,a.time1)<30)
      

  8.   

    最简单的办法就是前台程序控制,取出你要插的那条记录的time1和time2,比较一下,如果不达到要求就不插入。
      

  9.   

    --写错了,应该是icreate trigger tr_insert on 表名
    instead of insert
    as
    insert 表名(card,time1,time2,state)
    select card,time1,time2
    ,state=case when time1>time2 then N'出' else N'入' end
    from inserted i
    where not exists(
    select * from 表名
    where card=a.card
    and datediff(minute,time1,i.time1)<30
    and datediff(minute,time1,i.time1)<30