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

解决方案 »

  1.   

    create trigger tr_cTableA on TableA
    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
      

  2.   


    感谢版主,测试了一下,正常运行,但不是我要的触发效果,我是想在原表的基础上满足触发条件就更新那一个字段现在的效果是新插入一条记录
    以下是我按版主的写法修改的,请帮忙改成,当'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
      

  3.   

    我觉得你可以用个计算列ALTER TABLE TB DROP COLUMN date2
    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
      

  4.   


    谢谢ky_min,我对SQL不是很了解,我的需求就是,在一个表里面,当'd_pmt_ter'或'd_sal_time'两个字段的值发生变化时(插入或更新),按条件自动更新'd_account_rec_time'字段。我不知道你说的计算列,我只知道触发器,我这种情况,应该用那种比较好,
      

  5.   


    感谢版主,测试了一下,正常运行,但不是我要的触发效果,我是想在原表的基础上满足触发条件就更新那一个字段现在的效果是新插入一条记录
    以下是我按版主的写法修改的,请帮忙改成,当'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自己测测不可能会多记录,看触发器类型,是插入前触发只有插入后触发才需要更新,表没唯一列你根本判断不了,这样性能低