2016-04-28 20 views
-1

我有一個結構類似這樣SQL服務器 - 塔用以自上次行創建

CREATE TABLE log (
    id     BIGINT   IDENTITY (1, 1) PRIMARY KEY, 
    datetime_created DATETIME NOT NULL DEFAULT (getdate()), 
    message   VARCHAR(MAX) 
) 

表我想添加第四列,time_since,在默認情況下檢查之前行的datetime_created字段,並獲得時間差異並將其保存在新行的time_since列中。

有關如何完成此任何想法?

編輯:作爲一個說明,我受限於使用SQL Server 2008

+0

看起來像你需要一個INSERT觸發器做到這一點,但「上一行」的定義是一個有點含糊不清數據庫。如果你的意思是'id - 1',那麼有些場景(刪除行,失敗的插入語句)可能不存在該id。 –

+0

不一定是'id-1',只是字面上最後一行 – Steve

+3

關係表中沒有*最後一行*,但可以使用'MAXdatetime_created'' – dnoeth

回答

0

當插入新行,爲什麼不還插入等於DATEDIFF一個值(第二,(SELECT MAX(datetime_created)FROM日誌) ,CURRENT_TIMESTAMP)

1

我建議您只用LAG來計算它。這樣,如果日期發生變化,您將不需要更改此第二個字段。

例子:

CREATE TABLE log (
    id     BIGINT   IDENTITY (1, 1) PRIMARY KEY, 
    datetime_created DATETIME NOT NULL DEFAULT (getdate()), 
    message   VARCHAR(MAX) 
) 

insert into log values ('2016-01-01', 'first'); 
insert into log values ('2016-01-02T12:21:23', 'second'); 

SELECT l.id, l.datetime_created, l.message, DATEDIFF(SECOND, LAG(l.datetime_created) OVER (ORDER BY l.id), l.datetime_created) 
FROM log l 
+0

道歉,我應該提到我被迫使用SQL Server 2008.但是這對於2012+看起來很棒! – Steve

1

您可以用的,而不是觸發

create table log 
(
    id bigint identity(1, 1) primary key, 
    datetime_created datetime not null default (getdate()), 
    message varchar(max), 
    time_since int not null 
) 
go 

create trigger is_log on log 
instead of insert 
as 
    insert into log (datetime_created, message, time_since) 
    select datetime_created, message, 
     datediff(ss, isnull((select max(datetime_created) from log), getdate()), datetime_created) 
    from inserted 
go 

insert into log (message) 
values ('Message 1') 

waitfor delay '00:00:02'; 

insert into log (message) 
values ('Message 2') 

waitfor delay '00:00:04'; 

insert into log (message) 
values ('Message 3') 

waitfor delay '00:00:06'; 

insert into log (message) 
select message + 'multi insert' 
from log 
go 

select * 
from log