如何让数据库中某一个字段随时间自动更新

kunyou7003 2016-10-31 09:53:00
数据库中某一个字段存入员工工龄,是随时间变化的时间,比如说2015年时这个时间是2.5年,到了2016年就是3.5年,怎么用sql控制这个字段让它每个月自动更新一次,增加0.083(1/12),请问怎么写
...全文
2166 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪地孤灯 2016-11-03
  • 打赏
  • 举报
回复
如果你是要在数据库表中就显示这样的结果,很简单,在设计表的时候使用公式即可。这种方法最简单,最直接,也不用执行什么作业什么的。具体如下:
道素 2016-10-31
  • 打赏
  • 举报
回复
引用 9 楼 zbdzjx 的回复:
如果是MySQL,那就看一下这个:http://lobert.iteye.com/blog/1953827 要在数据库中去操作。 [quote=引用 4 楼 kunyou7003 的回复:] [quote=引用 2 楼 ch21st 的回复:] 你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
这个是写在php里面,还是直接操作数据库就行了,我用的数据库是phpmyadmin[/quote][/quote] 因为你这时要自动运行,所以你可以用phpmyadmin创建一个schedule,定期执行 下面是每天1点10分运行更新

mysql> create tb_employee(userid varchar(100),StartDate datetime,WorkedAge float);
insert into tb_employee(userID,StartDate)values('0001','2015-05-05');
---------------

create event `UpdateWorkedMonth` on schedule every 1 day starts '2016-11-01 01:10:00' 
do update tb_employee set WorkedAge=TIMESTAMPDIFF(MONTH,StartDate, curdate())/12;


zbdzjx 2016-10-31
  • 打赏
  • 举报
回复
如果是MySQL,那就看一下这个:http://lobert.iteye.com/blog/1953827 要在数据库中去操作。
引用 4 楼 kunyou7003 的回复:
[quote=引用 2 楼 ch21st 的回复:] 你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
这个是写在php里面,还是直接操作数据库就行了,我用的数据库是phpmyadmin[/quote]
道素 2016-10-31
  • 打赏
  • 举报
回复
你是MYSQL数据库 用CREATE EVENT 创建event 你的表里有用于起始的起始时间吗? 没有起始时间没法计算工龄
LongRui888 2016-10-31
  • 打赏
  • 举报
回复
如果是sql server 2008R2版本,可以使用派生列,例子如下:
drop table tt;

create table tt(c date) ;

insert into tt values('2016-01-01');

alter table tt
add per as cast(datediff(month,c,getdate())*1.0/12 as numeric(8,1));

select  * from tt
/*
c	per
2016-01-01	0.8
*/
kunyou7003 2016-10-31
  • 打赏
  • 举报
回复
引用 2 楼 ch21st 的回复:
你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
这个是写在php里面,还是直接操作数据库就行了,我用的数据库是phpmyadmin
引用 2 楼 ch21st 的回复:
你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
引用 4 楼 kunyou7003 的回复:
[quote=引用 2 楼 ch21st 的回复:] 你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
这个是写在php里面,还是直接操作数据库就行了,我用的数据库是phpmyadmin[/quote] 而且我的数据库里存入的不是一个日期,是像2.5年这样的年数
引用 1 楼 zbdzjx 的回复:
设定SQL Server定时作业job,每个月执行一次update。 可以参考:http://qsfwy.iteye.com/blog/250741
我用的是phpmyadmin里面好像买看到作业这样的设置啊
kunyou7003 2016-10-31
  • 打赏
  • 举报
回复
引用 2 楼 ch21st 的回复:
你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
这个是写在php里面,还是直接操作数据库就行了,我用的数据库是phpmyadmin
引用 2 楼 ch21st 的回复:
你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
引用 4 楼 kunyou7003 的回复:
[quote=引用 2 楼 ch21st 的回复:] 你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
这个是写在php里面,还是直接操作数据库就行了,我用的数据库是phpmyadmin[/quote] 而且我的数据库里存入的不是一个日期,是像2.5年这样的年数
kunyou7003 2016-10-31
  • 打赏
  • 举报
回复
引用 2 楼 ch21st 的回复:
你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
这个是写在php里面,还是直接操作数据库就行了,我用的数据库是phpmyadmin
足球不是方的 2016-10-31
  • 打赏
  • 举报
回复
这个写个作业做好咯,按你的需要看是每个月执行一次还是每天执行一次
道素 2016-10-31
  • 打赏
  • 举报
回复
你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
zbdzjx 2016-10-31
  • 打赏
  • 举报
回复
设定SQL Server定时作业job,每个月执行一次update。 可以参考:http://qsfwy.iteye.com/blog/250741
道素 2016-10-31
  • 打赏
  • 举报
回复
引用 12 楼 kunyou7003 的回复:
[quote=引用 10 楼 ch21st 的回复:] [quote=引用 9 楼 zbdzjx 的回复:] 如果是MySQL,那就看一下这个:http://lobert.iteye.com/blog/1953827 要在数据库中去操作。 [quote=引用 4 楼 kunyou7003 的回复:] [quote=引用 2 楼 ch21st 的回复:] 你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
这个是写在php里面,还是直接操作数据库就行了,我用的数据库是phpmyadmin[/quote][/quote] 因为你这时要自动运行,所以你可以用phpmyadmin创建一个schedule,定期执行 下面是每天1点10分运行更新

mysql> create tb_employee(userid varchar(100),StartDate datetime,WorkedAge float);
insert into tb_employee(userID,StartDate)values('0001','2015-05-05');
---------------

create event `UpdateWorkedMonth` on schedule every 1 day starts '2016-11-01 01:10:00' 
do update tb_employee set WorkedAge=TIMESTAMPDIFF(MONTH,StartDate, curdate())/12;


[/quote] CREATE EVENT test ON SCHEDULE EVERY 1 SECOND starts '2016-10-31 15:06:00' DO UPDATE position SET Exp_CAE=Exp_CAE+ round(TIMESTAMPDIFF(MONTH,'2016-09-30',curdate())/12.0,2) 我试了这样的,sql语句成功执行了,但是数据并没有更新啊[/quote] 这是创建的一个job,到你设定的时间才运行,你将时间设定的离你当前时间近点
薛定谔的DBA 2016-10-31
  • 打赏
  • 举报
回复
--	drop table tab
create table tab(
id int identity(1,1),
birthDate datetime,
age as datediff(YEAR,birthDate,GETDATE()))
go
insert into tab(birthDate)
select '2001-05-15' union all
select '1969-01-11' union all
select '2000-08-01' union all
select '1988-10-25' union all
select '2012-05-12'
go
select * from tab

id	birthDate				age
--	-----------------------	----
1	2001-05-15 00:00:00.000	15
2	2001-05-15 00:00:00.000	15
3	1969-01-11 00:00:00.000	47
4	2000-08-01 00:00:00.000	16
5	1988-10-25 00:00:00.000	28
计算列若标记为 PERSISTED,才能参与 FOREIGN KEY 或 CHECK 约束
kunyou7003 2016-10-31
  • 打赏
  • 举报
回复
引用 10 楼 ch21st 的回复:
[quote=引用 9 楼 zbdzjx 的回复:] 如果是MySQL,那就看一下这个:http://lobert.iteye.com/blog/1953827 要在数据库中去操作。 [quote=引用 4 楼 kunyou7003 的回复:] [quote=引用 2 楼 ch21st 的回复:] 你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
这个是写在php里面,还是直接操作数据库就行了,我用的数据库是phpmyadmin[/quote][/quote] 因为你这时要自动运行,所以你可以用phpmyadmin创建一个schedule,定期执行 下面是每天1点10分运行更新

mysql> create tb_employee(userid varchar(100),StartDate datetime,WorkedAge float);
insert into tb_employee(userID,StartDate)values('0001','2015-05-05');
---------------

create event `UpdateWorkedMonth` on schedule every 1 day starts '2016-11-01 01:10:00' 
do update tb_employee set WorkedAge=TIMESTAMPDIFF(MONTH,StartDate, curdate())/12;


[/quote] CREATE EVENT test ON SCHEDULE EVERY 1 SECOND starts '2016-10-31 15:06:00' DO UPDATE position SET Exp_CAE=Exp_CAE+ round(TIMESTAMPDIFF(MONTH,'2016-09-30',curdate())/12.0,2) 我试了这样的,sql语句成功执行了,但是数据并没有更新啊
kunyou7003 2016-10-31
  • 打赏
  • 举报
回复
引用 2 楼 ch21st 的回复:
你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
引用 2 楼 ch21st 的回复:
你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
引用 2 楼 ch21st 的回复:
你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
引用 10 楼 ch21st 的回复:
[quote=引用 9 楼 zbdzjx 的回复:] 如果是MySQL,那就看一下这个:http://lobert.iteye.com/blog/1953827 要在数据库中去操作。 [quote=引用 4 楼 kunyou7003 的回复:] [quote=引用 2 楼 ch21st 的回复:] 你设置一个job,用SQL Agent就行,每天或每个月运行按照 你的需要 然后根据datediff(mm,入职时间,getdate())/12.0

UPDATE e SET e.workmonth= round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)--=1.5
FROM employee e
WHERE  e.workmonth!=round(DATEDIFF(mm,'5/5/2015',GETDATE())/12.0,1)
这个是写在php里面,还是直接操作数据库就行了,我用的数据库是phpmyadmin[/quote][/quote] 因为你这时要自动运行,所以你可以用phpmyadmin创建一个schedule,定期执行 下面是每天1点10分运行更新

mysql> create tb_employee(userid varchar(100),StartDate datetime,WorkedAge float);
insert into tb_employee(userID,StartDate)values('0001','2015-05-05');
---------------

create event `UpdateWorkedMonth` on schedule every 1 day starts '2016-11-01 01:10:00' 
do update tb_employee set WorkedAge=TIMESTAMPDIFF(MONTH,StartDate, curdate())/12;


[/quote] CREATE EVENT e_test ON SCHEDULE EVERY 1 Day DO UPDATE position SET Exp_CAE=Exp_CAE+ round(DATEDIFF(mm,'2016-09-30',GETDATE())/12.0,2) 这样不知道为什么不对,DATEDIFF报错了,我Exp_CAE存入的是年数2.5,2016-09-30'是该员工工作年数为2.5时的时间,这样加起来就可以了吧,Exp_CAE是用计算得到的年数,并不一定是简单的减去起始时间,所以这个字段我必须存入年数

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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