date(时间) pmt(账期) date2想要的结果2014-12-15 月结 2014-12-31
2014-12-15 30天 2015-01-14
2014-12-15 月结30天 2015-01-30表结果如上,当表中date,和pmt 插入,或者修改时,生成date2计算规则如下:月结:到本月的最后一天结算,2014-12-15,结果就是2014-12-31
30天:在日期的基础上加30天,2014-12-15,结果就是2015-01-14
月结30天:本月剩下的日期+30天,2014-12-15,结果是2015-01-30
2014-12-15 30天 2015-01-14
2014-12-15 月结30天 2015-01-30表结果如上,当表中date,和pmt 插入,或者修改时,生成date2计算规则如下:月结:到本月的最后一天结算,2014-12-15,结果就是2014-12-31
30天:在日期的基础上加30天,2014-12-15,结果就是2015-01-14
月结30天:本月剩下的日期+30天,2014-12-15,结果是2015-01-30
instead of insert
as
set nocount on;
insert into TableA([date],[pmt],[date2])
select [date],[pmt],
[date2]=case [pmt] when '月结' then CONVERT(varchar(8),dateadd(mm,1,[date]),120)+'01'
when '30天' then dateadd(dd,30,[date])
when '月结30天' then dateadd(dd,30,CONVERT(varchar(8),dateadd(mm,1,[date]),120)+'01')
end
from inserted
感谢版主,测试了一下,正常运行,但不是我要的触发效果,我是想在原表的基础上满足触发条件就更新那一个字段现在的效果是新插入一条记录
以下是我按版主的写法修改的,请帮忙改成,当'd_pmt_ter'或'd_sal_time'两个字段的值发生变化时(插入或更新),自动更新'd_account_rec_time'字段。CREATE TRIGGER [d_account_rec_time] ON [dbo].[d_sale]
instead of insert
AS
set nocount on;
insert into [dbo].[d_sale] ([d_sal_time],[d_pmt_ter],[d_account_rec_time])
select [d_sal_time],[d_pmt_ter],
[d_account_rec_time]=case [d_pmt_ter] when '现金' then [d_sal_time]
when '15天' then dateadd(dd,15,[d_sal_time])
when '30天' then dateadd(dd,30,[d_sal_time])
when '60天' then dateadd(dd,60,[d_sal_time])
when '90天' then dateadd(dd,90,[d_sal_time])
when '月结30天' then dateadd(dd,30,CONVERT(varchar(8),dateadd(mm,1,[d_sal_time]),120)+'01')
when '月结60天' then dateadd(dd,60,CONVERT(varchar(8),dateadd(mm,1,[d_sal_time]),120)+'01')
when '月结90天' then dateadd(dd,90,CONVERT(varchar(8),dateadd(mm,1,[d_sal_time]),120)+'01')
end
from inserted
ALTER TABLE TB ADD date2 AS
CASE WHEN pmt='月结'THEN DATEADD(DAY,-DAY(DATEADD(MONTH,1,date)),DATEADD(MONTH,1,date))
WHEN pmt='30天'THEN DATEADD(DAY,30,date)
WHEN pmt='月结30天'THEN DATEADD(DAY,-DAY(DATEADD(MONTH,1,DATEADD(DAY,30,date))),DATEADD(MONTH,1,DATEADD(DAY,30,date)))
END如果一定要用触发器,最好有个主键CREATE TRIGGER TRG_TB_EDIT
ON TB
FOR INSERT,UPDATE
AS
BEGIN
UPDATE TB
SET date2=(CASE WHEN T1.pmt='月结'THEN DATEADD(DAY,-DAY(DATEADD(MONTH,1,T1.date)),DATEADD(MONTH,1,T1.date))
WHEN T1.pmt='30天'THEN DATEADD(DAY,30,T1.date)
WHEN T1.pmt='月结30天'THEN DATEADD(DAY,-DAY(DATEADD(MONTH,1,DATEADD(DAY,30,T1.date))),DATEADD(MONTH,1,DATEADD(DAY,30,T1.date)))
END)
FROM TB T1
JOIN INSERTED T2 ON T1.主键=T2.主键
END如果实现不要,那就在触发时,全部更新CREATE TRIGGER TRG_TB_EDIT
ON TB
FOR INSERT,UPDATE
AS
BEGIN
UPDATE T1
SET date2=(CASE WHEN T1.pmt='月结'THEN DATEADD(DAY,-DAY(DATEADD(MONTH,1,T1.date)),DATEADD(MONTH,1,T1.date))
WHEN T1.pmt='30天'THEN DATEADD(DAY,30,T1.date)
WHEN T1.pmt='月结30天'THEN DATEADD(DAY,-DAY(DATEADD(MONTH,1,DATEADD(DAY,30,T1.date))),DATEADD(MONTH,1,DATEADD(DAY,30,T1.date)))
END)
FROM TB T1
END
谢谢ky_min,我对SQL不是很了解,我的需求就是,在一个表里面,当'd_pmt_ter'或'd_sal_time'两个字段的值发生变化时(插入或更新),按条件自动更新'd_account_rec_time'字段。我不知道你说的计算列,我只知道触发器,我这种情况,应该用那种比较好,
感谢版主,测试了一下,正常运行,但不是我要的触发效果,我是想在原表的基础上满足触发条件就更新那一个字段现在的效果是新插入一条记录
以下是我按版主的写法修改的,请帮忙改成,当'd_pmt_ter'或'd_sal_time'两个字段的值发生变化时(插入或更新),自动更新'd_account_rec_time'字段。CREATE TRIGGER [d_account_rec_time] ON [dbo].[d_sale]
instead of insert
AS
set nocount on;
insert into [dbo].[d_sale] ([d_sal_time],[d_pmt_ter],[d_account_rec_time])
select [d_sal_time],[d_pmt_ter],
[d_account_rec_time]=case [d_pmt_ter] when '现金' then [d_sal_time]
when '15天' then dateadd(dd,15,[d_sal_time])
when '30天' then dateadd(dd,30,[d_sal_time])
when '60天' then dateadd(dd,60,[d_sal_time])
when '90天' then dateadd(dd,90,[d_sal_time])
when '月结30天' then dateadd(dd,30,CONVERT(varchar(8),dateadd(mm,1,[d_sal_time]),120)+'01')
when '月结60天' then dateadd(dd,60,CONVERT(varchar(8),dateadd(mm,1,[d_sal_time]),120)+'01')
when '月结90天' then dateadd(dd,90,CONVERT(varchar(8),dateadd(mm,1,[d_sal_time]),120)+'01')
end
from inserted自己测测不可能会多记录,看触发器类型,是插入前触发只有插入后触发才需要更新,表没唯一列你根本判断不了,这样性能低