如何在SQL Server中存储/检索时间戳?

时间:2011-09-11 16:50:55

标签: c# sql-server

我有一个表,每行需要一个时间戳来标记插入的时间。我没有很多数据库经验,但有些东西告诉我,这最好在数据库端自动处理,例如通过存储过程。

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()

在“默认值或绑定”行的“常规”部分下。每当插入新行时,数据库会自动将当前日期和时间作为时间戳。

4 个答案:

答案 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_TIMESTAMPFN 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是表的名称。)

然而,日期时间列上的默认值的其他答案可能是您的最佳选择。