Oracle数据表自动更新

crossfile 2011-05-12 04:34:24
刚刚涉足Oracle数据库,问题是这样的,有一张广告数据表,表中有3个字段,start_time(date类型,表示广告投放日期),end_time(date类型,表示广告过期日期),expired(int类型,0表示已过期,1表示未过期),广告投放时,其状态为未过期,之后,当日期到了其投放时设定的过期时间时,就将该广告的状态变为已过期,不想通过程序去定期检测,想通过数据库的设置来完成此项功能。望大家帮忙看看,是否可行及如何实现,谢谢了先!
...全文
271 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxx1997 2011-07-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jxlhc09 的回复:]

引用 14 楼 cxx1997 的回复:
select * From table where end_time<trunc(sysdate);

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

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

sysdate 是数据库时间,你改了你的系统时间,sysdate 会变的唯一原因 是 你的数据库就在你的机器上
crossfile 2011-06-07
  • 打赏
  • 举报
回复
最终采取的方案,通过后台服务器,去定时更新数据。
toadzw 2011-05-31
  • 打赏
  • 举报
回复
意见:不要使用JOB,你可以在数据展现的时候再来判断,如果你是为了加速数据查询速度的,那么可以考虑使用JOB,不然只要在数据展现时比较一下,延迟这种计算比较好,节省资源,叫延迟计算
BetterMe 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jxlhc09 的回复:]

引用 14 楼 cxx1997 的回复:
select * From table where end_time<trunc(sysdate);

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

刚才试了下。。我只要更改了我的系统时间sysdate也就会跟着改了的
[/Quote]
sysdate...sys=system,怎么会不是系统时间?........还有实在不明白trunc(sysdate)什么意思,好歹加上[FMT]吧?再者如果只是为了判断是否过期,直接日期比较就可以,通过存储过程来实现update
cxx1997 2011-05-27
  • 打赏
  • 举报
回复
select * From table where end_time<trunc(sysdate);

中sysdate 是数据库时间,不是你本机时间,不会出现“如果你登录管理系统的机器(与服务器不是同一台机器)时间有误”
crossfile 2011-05-27
  • 打赏
  • 举报
回复
说的有道理,但是select * From table where end_time<trunc(sysdate);如何在程序中使用这个方法,会存在弊病,对于数据库会有个管理系统,如果你登录管理系统的机器(与服务器不是同一台机器)时间有误,那你查询的结果是不是就有误了?
randee_luo 2011-05-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cxx1997 的回复:]
select * From table where end_time<trunc(sysdate);

中sysdate 是数据库时间,不是你本机时间,不会出现“如果你登录管理系统的机器(与服务器不是同一台机器)时间有误”
[/Quote]
刚才试了下。。我只要更改了我的系统时间sysdate也就会跟着改了的
hawei6 2011-05-27
  • 打赏
  • 举报
回复
这里的系统时间只是一个参数,看你应用怎么传递了,你可以在你的应用中先把系统时间转成一般的日期格式再传进来的,并不是一定要用oracle中的系统时间。

[Quote=引用 13 楼 crossfile 的回复:]
说的有道理,但是select * From table where end_time<trunc(sysdate);如何在程序中使用这个方法,会存在弊病,对于数据库会有个管理系统,如果你登录管理系统的机器(与服务器不是同一台机器)时间有误,那你查询的结果是不是就有误了?
[/Quote]
hawei6 2011-05-26
  • 打赏
  • 举报
回复
应用如果使用end_time作为判断条件,就可以查询历史上或未来任何时间点的过期与为过期的广告。
但是如果使用字段expired做判断条件,就只能查询当前时间点的情况,不够灵活。
还要做Trigger等许多比较麻烦的工作
hawei6 2011-05-26
  • 打赏
  • 举报
回复
个人感觉你的数据库表设计的就有问题,既然你表中有了end_time标示过期时间,那么字段expired就是多余的。
你在应用中查询过期的就用
select * From table where end_time<trunc(sysdate);
未过期:
select * From table where end_time>=trunc(sysdate);

THS!

lovecmcmcm 2011-05-26
  • 打赏
  • 举报
回复
写个过程,传入当前时前,与过期时间做个对比,如果系统时间大于过期时间时写个UPDATE语句就OK了。

JOB可以定在每天临晨:00点运行。
crossfile 2011-05-25
  • 打赏
  • 举报
回复
设计expired字段,是为了使用该模块数据的程序无需判断,可直接查询获取所需数据。
「已注销」 2011-05-23
  • 打赏
  • 举报
回复
从设计上课用不着expired字段,这是个冗余字段,
因为本身通过start_time和end_time就可以确定广告是否已过期,为啥还要多一个字段出来表示,若两者未一致反而产生歧义了。
crossfile 2011-05-23
  • 打赏
  • 举报
回复
说了半天,还是云里雾里啊……
crossfile 2011-05-19
  • 打赏
  • 举报
回复
哦,Oracle Job
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 shadow1986a 的回复:]
当然可行了。 先建个过程用来修改这个标记。然后把这个过程提交到一个job中每天定时执行一次就行了
[/Quote]
304的的哥 2011-05-13
  • 打赏
  • 举报
回复
crossfile 2011-05-13
  • 打赏
  • 举报
回复
能够具体的讲解下吗?
cncmaxcnc 2011-05-12
  • 打赏
  • 举报
回复
可行。关键技术是建个过程和JOB。
shadow1986a 2011-05-12
  • 打赏
  • 举报
回复
当然可行了。 先建个过程用来修改这个标记。然后把这个过程提交到一个job中每天定时执行一次就行了

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧