我有一个表,每行需要一个时间戳来标记插入的时间。我没有很多数据库经验,但有些东西告诉我,这最好在数据库端自动处理,例如通过存储过程。
MS SQL中有一个timestamp数据类型,但是阅读它,它被视为一系列数字而不是C#中的DateTime对象。因此,如果我必须进行转换,那么它不能只是一个NVARCHAR数据类型吗?
那么简单地说,当一行插入表中时,(自动?)将一个时间戳放在一行上最简单的方法是什么?
编辑:表定义非常简单。它目前只有两列,但仍缺少时间戳列。
SqlCommand command = con.CreateCommand();
command.CommandText = "INSERT INTO Bio VALUES (" +
"@ID, @Name)";
command.Parameters.AddWithValue("ID",number);
command.Parameters.AddWithValue("Name", name);
try
{
SqlDataReader thisReader = command.ExecuteReader();
thisReader.Close();
}
catch { // Do something };
解决方案好的,它现在有效。我首先尝试通过Visual Studio 2008中的“服务器资源管理器”窗口添加新列。查找我的数据库,右键单击并选择“新建查询”。然后键入类似
的内容ALTER TABLE dbo.MyTable ADD CreatedDate datetime NOT NULL DEFAULT (GetUtcDate())
但我收到了消息
不支持ALTER TABLE SQL构造 查询无法在图表和标准窗格中以图形方式表示。
所以我用图形方式添加了它。首先“打开表定义”并在“数据类型”下的“列名称”和“日期时间”下添加CreatedDate。删除允许空值检查。然后在列属性中添加了
getutcdate()
在“默认值或绑定”行的“常规”部分下。每当插入新行时,数据库会自动将当前日期和时间作为时间戳。
答案 0 :(得分:8)
在表中创建一个CreatedDate列,如下所示:
ALTER TABLE dbo.MyTable ADD CreatedDate datetime NOT NULL DEFAULT (GetUtcDate())
编辑:如果之后您希望在每次更新该记录时更新值,您可以将GetUtcDate()重新分配给该列或另一个列(我称之为Createddate,因此不应使用在更新中,但您可以添加另一个或将其重命名为Modifieddate)。我肯定会在执行UPDATE
的存储过程中包含此类列的更新,此处不需要触发器。
答案 1 :(得分:6)
SQL Server“timestamp”类型与标准“timestamp”不同:它更准确地说是“rowversion”。不推荐使用数据类型“timestamp”。 See MSDN for all of this
您应该使用datetime which is a real date/time value
最简单的方法是在表上使用GETDATE或GETUTCDATE对DEFAULT进行DEFAULT,以便SQL Server自动维护它
修改:更新
您可以将此语法用于更新
UPDATE T SET col = @x, UpdatedDateTime = DEFAULT WHERE ...
这很有用,因为默认约束确定的值不是代码。因此,如果您更改默认值(例如,从GETDATE切换到GETUTCDATE),则更改约束,而不是代码
答案 2 :(得分:1)
您可以使用CURRENT_TIMESTAMP
或FN NOW()
将时间戳插入一行。
答案 3 :(得分:1)
创建触发器是一种方法,尽管可能不是最佳方法,但如果您还想在更新行时更新时间戳,则在SQL端处理此操作:
CREATE TRIGGER MyTimestampTrigger ON tblMyTable FOR INSERT,UPDATE AS
UPDATE tblMyTable SET fldTimestamp=getdate() WHERE fldId IN (SELECT fldId FROM INSERTED)
GO
(如果fldId是主键,则fldTimestamp是时间戳字段,tblMyTable是表的名称。)
然而,日期时间列上的默认值的其他答案可能是您的最佳选择。