数据库触发器求教

忆稚 2018-12-12 10:56:51
自己建了一张表里面有属性入职时间,之后的工龄的值是当前时间和入职时间的差值,问怎样实现
...全文
436 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 2018-12-26
  • 打赏
  • 举报
回复
引用 11 楼 Ultra_0611 的回复:
[quote=引用 3 楼 吉普赛的歌 的回复:]不需要触发器, 加计算列就可以了
USE tempdb
GO
IF OBJECT_ID('user_info') IS NOT NULL DROP TABLE user_info
GO
CREATE TABLE user_info(
	id INT IDENTITY(1,1) PRIMARY KEY,
	userName NVARCHAR(20) NOT NULL,
	entryTime DATETIME NOT NULL
)
GO
INSERT INTO user_info(userName,entryTime) VALUES('小明','2008-12-01')
INSERT INTO user_info(userName,entryTime) VALUES('小刚','2017-10-01')
---- 以上为测试表及测试数据 -----

--加多一个计算列就可以了, 以后不用自己去换算
ALTER TABLE user_info ADD workYears AS DATEDIFF(YEAR,entryTime,GETDATE())
GO

SELECT * FROM user_info AS ui
/*
id          userName             entryTime               workYears
----------- -------------------- ----------------------- -----------
1           小明                   2008-12-01 00:00:00.000 10
2           小刚                   2017-10-01 00:00:00.000 1
 */
好棒呀大佬[/quote] 如果你的问题已经解决, 那就结贴吧。 结贴率高, 会有更多人帮助你
忆稚 2018-12-26
  • 打赏
  • 举报
回复
引用 5 楼 Dear SQL 的回复:
也可以用计算列,我只在SQL SERVER 2017下测试是可以的

create table aa2(indate datetime,dates as datediff(year,indate,getdate()))
非常感谢大佬
忆稚 2018-12-26
  • 打赏
  • 举报
回复
引用 4 楼 二月十六 的回复:
加一个默认值就行了,工龄按月写的例子
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([Id] int,[AddTime] Date,[GL] AS DATEDIFF(MONTH,AddTime,GETDATE()))
Insert #T
select 1,'2018-10-01'
Go
--测试数据结束
Select * from #T
非常感谢大佬
忆稚 2018-12-26
  • 打赏
  • 举报
回复
引用 3 楼 吉普赛的歌 的回复:
不需要触发器, 加计算列就可以了
USE tempdb
GO
IF OBJECT_ID('user_info') IS NOT NULL DROP TABLE user_info
GO
CREATE TABLE user_info(
	id INT IDENTITY(1,1) PRIMARY KEY,
	userName NVARCHAR(20) NOT NULL,
	entryTime DATETIME NOT NULL
)
GO
INSERT INTO user_info(userName,entryTime) VALUES('小明','2008-12-01')
INSERT INTO user_info(userName,entryTime) VALUES('小刚','2017-10-01')
---- 以上为测试表及测试数据 -----

--加多一个计算列就可以了, 以后不用自己去换算
ALTER TABLE user_info ADD workYears AS DATEDIFF(YEAR,entryTime,GETDATE())
GO

SELECT * FROM user_info AS ui
/*
id          userName             entryTime               workYears
----------- -------------------- ----------------------- -----------
1           小明                   2008-12-01 00:00:00.000 10
2           小刚                   2017-10-01 00:00:00.000 1
 */
好棒呀大佬
wwfxgm 2018-12-15
  • 打赏
  • 举报
回复
大家都用datediff。 现在不都是在用datediff_big 啊。为什么版主都不用?
唐诗三百首 2018-12-15
  • 打赏
  • 举报
回复
可以用计算列实现,

create table Emps
(EmpNum varchar(10) not null,
入职时间 date,
工龄 as datediff(yy,入职时间,getdate()))

insert into Emps(EmpNum,入职时间)
select 'E001','2009-06-05' union all
select 'E002','2012-01-05'


select * from Emps

/*
EmpNum 入职时间 工龄
---------- ---------- -----------
E001 2009-06-05 9
E002 2012-01-05 6

(2 row(s) affected)
*/
吉普赛的歌 2018-12-15
  • 打赏
  • 举报
回复
引用 8 楼 wwfxgm 的回复:
大家都用datediff。 现在不都是在用datediff_big 啊。为什么版主都不用?
datediff_big 是 sqlserver 2016 才有的功能。 另外, 不是新出来就得用, 这个函数不过是为了补充 datediff 返回值如果太大无法接收的问题。 datediff 返回 int,最大值 二十多亿 datediff_big 返回 bigint 对这个问题来说, 入职超过二十亿年木乃伊也成灰了吧 ……
Dear SQL(燊) 2018-12-13
  • 打赏
  • 举报
回复
触发器有问题,随时间的推移值是不会变的 如果考虑完整,还有加入离职日期
select  datediff(year,入职日期,isnull(离职日期,当前日期)) 
二月十六 版主 2018-12-13
  • 打赏
  • 举报
回复
或者楼主就想用触发器 新建表:
if not object_id(N'T') is null
	drop table T
Go
Create table T([Id] int,[AddTime] Date,[GL] INT)
新建触发器:
CREATE TRIGGER dbo.T_GL_TRI
ON [dbo].T
FOR INSERT
AS
UPDATE T
SET GL = DATEDIFF(MONTH, T.AddTime, GETDATE())
FROM Inserted
WHERE Inserted.Id = T.Id;
GO
插入数据:
Insert T(ID,AddTime)
select 1,'2018-09-01' UNION
SELECT 2,'2017-10-01'
测试:
Select * from T
结果:
Dear SQL(燊) 2018-12-13
  • 打赏
  • 举报
回复
也可以用计算列,我只在SQL SERVER 2017下测试是可以的

create table aa2(indate datetime,dates as datediff(year,indate,getdate()))
二月十六 版主 2018-12-13
  • 打赏
  • 举报
回复
加一个默认值就行了,工龄按月写的例子
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([Id] int,[AddTime] Date,[GL] AS DATEDIFF(MONTH,AddTime,GETDATE()))
Insert #T
select 1,'2018-10-01'
Go
--测试数据结束
Select * from #T
吉普赛的歌 2018-12-13
  • 打赏
  • 举报
回复
不需要触发器, 加计算列就可以了
USE tempdb
GO
IF OBJECT_ID('user_info') IS NOT NULL DROP TABLE user_info
GO
CREATE TABLE user_info(
	id INT IDENTITY(1,1) PRIMARY KEY,
	userName NVARCHAR(20) NOT NULL,
	entryTime DATETIME NOT NULL
)
GO
INSERT INTO user_info(userName,entryTime) VALUES('小明','2008-12-01')
INSERT INTO user_info(userName,entryTime) VALUES('小刚','2017-10-01')
---- 以上为测试表及测试数据 -----

--加多一个计算列就可以了, 以后不用自己去换算
ALTER TABLE user_info ADD workYears AS DATEDIFF(YEAR,entryTime,GETDATE())
GO

SELECT * FROM user_info AS ui
/*
id          userName             entryTime               workYears
----------- -------------------- ----------------------- -----------
1           小明                   2008-12-01 00:00:00.000 10
2           小刚                   2017-10-01 00:00:00.000 1
 */
Dear SQL(燊) 2018-12-13
  • 打赏
  • 举报
回复
不要用触发器,写个视图就可以了
Dear SQL(燊) 2018-12-13
  • 打赏
  • 举报
回复
参数SQL SERVER 函数datediff
 select  datediff(year,入职日期,当前日期) 

34,588

社区成员

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

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