刚刚涉足Oracle数据库,问题是这样的,有一张广告数据表,表中有3个字段,start_time(date类型,表示广告投放日期),end_time(date类型,表示广告过期日期),expired(int类型,0表示已过期,1表示未过期),广告投放时,其状态为未过期,之后,当日期到了其投放时设定的过期时间时,就将该广告的状态变为已过期,不想通过程序去定期检测,想通过数据库的设置来完成此项功能。望大家帮忙看看,是否可行及如何实现,谢谢了先!

解决方案 »

  1.   

    当然可行了。 先建个过程用来修改这个标记。然后把这个过程提交到一个job中每天定时执行一次就行了
      

  2.   

    可行。关键技术是建个过程和JOB。
      

  3.   


    oracle job
      

  4.   

    从设计上课用不着expired字段,这是个冗余字段,
    因为本身通过start_time和end_time就可以确定广告是否已过期,为啥还要多一个字段出来表示,若两者未一致反而产生歧义了。
      

  5.   

    设计expired字段,是为了使用该模块数据的程序无需判断,可直接查询获取所需数据。
      

  6.   

    写个过程,传入当前时前,与过期时间做个对比,如果系统时间大于过期时间时写个UPDATE语句就OK了。JOB可以定在每天临晨:00点运行。
      

  7.   

    个人感觉你的数据库表设计的就有问题,既然你表中有了end_time标示过期时间,那么字段expired就是多余的。
    你在应用中查询过期的就用
     select * From table where end_time<trunc(sysdate);
    未过期:
     select * From table where end_time>=trunc(sysdate);THS!
      

  8.   

    应用如果使用end_time作为判断条件,就可以查询历史上或未来任何时间点的过期与为过期的广告。
    但是如果使用字段expired做判断条件,就只能查询当前时间点的情况,不够灵活。
    还要做Trigger等许多比较麻烦的工作
      

  9.   

    说的有道理,但是select * From table where end_time<trunc(sysdate);如何在程序中使用这个方法,会存在弊病,对于数据库会有个管理系统,如果你登录管理系统的机器(与服务器不是同一台机器)时间有误,那你查询的结果是不是就有误了?
      

  10.   

    select * From table where end_time<trunc(sysdate);中sysdate 是数据库时间,不是你本机时间,不会出现“如果你登录管理系统的机器(与服务器不是同一台机器)时间有误”
      

  11.   

    这里的系统时间只是一个参数,看你应用怎么传递了,你可以在你的应用中先把系统时间转成一般的日期格式再传进来的,并不是一定要用oracle中的系统时间。
      

  12.   

    刚才试了下。。我只要更改了我的系统时间sysdate也就会跟着改了的
      

  13.   

    sysdate...sys=system,怎么会不是系统时间?........还有实在不明白trunc(sysdate)什么意思,好歹加上[FMT]吧?再者如果只是为了判断是否过期,直接日期比较就可以,通过存储过程来实现update
      

  14.   

    意见:不要使用JOB,你可以在数据展现的时候再来判断,如果你是为了加速数据查询速度的,那么可以考虑使用JOB,不然只要在数据展现时比较一下,延迟这种计算比较好,节省资源,叫延迟计算
      

  15.   


    sysdate 是数据库时间,你改了你的系统时间,sysdate 会变的唯一原因 是 你的数据库就在你的机器上