【发布时间】:2013-08-18 01:17:49
【问题描述】:
我是 SQL 新手,我想为 createdtime 和 modifiedtime 列创建时间戳。 然后将 createdtime 与 modifiedtime 进行比较,如果 modifiedtime 大于 10 分钟,则不会让该行被更新。 我怎样才能做到这一点? 我正在使用 sql server 2008 R2 谢谢
【问题讨论】:
标签: sql-server timestamp
我是 SQL 新手,我想为 createdtime 和 modifiedtime 列创建时间戳。 然后将 createdtime 与 modifiedtime 进行比较,如果 modifiedtime 大于 10 分钟,则不会让该行被更新。 我怎样才能做到这一点? 我正在使用 sql server 2008 R2 谢谢
【问题讨论】:
标签: sql-server timestamp
创建时间戳很简单:DATETIME 类型的列(适用于 2005 年之前的 SQL Server)或 DATETIME2(3)(2008 年或更新版本)和 DEFAULT CONSTRAINT SYSDATETIME()
SQL Server 2000/2005:
CREATE TABLE dbo.YourTable
( ..... your columns ......,
CreatedTimeStamp DATETIME NOT NULL
CONSTRAINT DF_YourTable_Created DEFAULT (GETDATE())
)
SQL Server 2008 及更新版本:
CREATE TABLE dbo.YourTable
( ..... your columns ......,
CreatedTimeStamp DATETIME2(3) NOT NULL
CONSTRAINT DF_YourTable_Created DEFAULT (SYSDATETIME())
)
修改后的时间戳必须用每个表上的触发器来处理
CREATE TRIGGER trgYourTableModified
AFTER UPDATE ON dbo.YourTable
AS
UPDATE dbo.YourTable
SET ModifiedDate = GETDATE() -- or use SYSDATETIME() for 2008 and newer
FROM Inserted i
WHERE i.ID = dbo.YourTable.ID
在此触发器中,您还可以检查 10 分钟的间隔 - 如果差异超过 10 分钟,只需在触发器中调用 ROLLBACK TRANSACTION 以停止更新
您需要意识到 SQL Server 中的触发器是每条语句 - 而不是每行!因此,如果您的 UPDATE 语句更新 50 行,您的触发器将触发 一次,并且触发器内的 Inserted 和 Deleted 伪表将包含 50 行处理。
【讨论】:
Declare @CreatedTime Datetime, @ModifiedTime DateTime
Set @CreatedTime='2013-08-15 14:10:00'
Set @ModifiedTime='2013-08-15 14:50:00'
if(dateDiff(Minute,@CreatedTime,@ModifiedTime)<10)
Update Statement
Else
Print 'Table Can not be updated'
【讨论】: