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

本文关键字:时间戳 检索 SQL Server 何存储 存储 | 更新日期: 2023-09-27 18:08:09

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

在MS SQL中有一个时间戳数据类型,但是读到它,它被视为一系列数字,而不是c#中的DateTime对象。如果我必须进行转换,它就不能是NVARCHAR数据类型吗?

简单地说,在插入到表中的行上(自动地)添加时间戳的最简单方法是什么?

Edit:表定义非常简单。它目前只有两列,并且仍然缺少时间戳列。

        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结构查询不能在"关系图和条件窗格"中以图形方式表示。

所以我用图形表示。首先"打开表定义",在Column Name下添加CreatedDate,在Data Type下添加datetime。删除"允许空"检查。然后在列属性中添加

getutcdate()
在"默认值或绑定"行中"常规"部分的

下。每当插入新行时,数据库自动将当前日期和时间作为时间戳提供给它。

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

在表中创建一个CreatedDate列,如下所示:

ALTER TABLE dbo.MyTable ADD CreatedDate datetime NOT NULL DEFAULT (GetUtcDate())

Edit:如果之后您想要在该记录的每次更新时更新值,您可以将GetUtcDate()重新分配到该列或另一个(我称之为Createddate,因此不应在更新中使用,但您可以添加另一个或将其重命名为Modifieddate)。我肯定会在执行UPDATE的存储过程中包含这样的列的更新,这里不需要触发器。

SQL Server的"timestamp"类型与标准的"timestamp"类型不同:它更正确的是"rowversion"。数据类型"时间戳"已被弃用。所有这些

请参阅MSDN

你应该使用datetime,它是一个真实的日期/时间值

最简单的方法是在表上具有GETDATE或GETUTCDATE的列上设置DEFAULT,以便SQL Server自动维护它

编辑:用于更新

你可以使用这个语法来更新

UPDATE T SET col = @x, UpdatedDateTime = DEFAULT WHERE ...

这很有用,因为默认约束决定值而不是代码。所以如果你改变默认值(比如你从GETDATE切换到GETUTCDATE)那么你改变的是约束,而不是代码

您可以使用CURRENT_TIMESTAMPFN NOW()在行中插入时间戳

如果您还希望在更新行时更新时间戳,那么创建触发器是在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是表名)

在日期时间列上使用默认值的其他答案可能是您的最佳选择。