SQL表中的创建日期列

时间:2010-04-29 13:42:38

标签: sql vb.net sql-server-2005 datetime

使用创建行的日期自动填充SQL数据表中的datetime列的最简单方法是什么?如果重要,请使用SQL Server 2005.

编辑:我尝试使用GETDATE()作为默认值,并且适用于INSERT查询,但不适用于TableAdapter添加行。

6 个答案:

答案 0 :(得分:5)

ALTER TABLE table
ADD column NOT NULL DEFAULT (GETDATE())

答案 1 :(得分:2)

您应该创建列并拥有:

  • 一个insert(after)触发器,它将其设置为当前日期(或日期/时间)。
  • 更新(代替)触发器,不允许列更改。

任何默认值解决方案都不安全,因为可以通过在插入或之后更改列时专门设置列来绕过它。基于触发器的解决方案将控件与DBMS放在一起。

答案 2 :(得分:1)

使用getdate()函数

类似于:insert data1, data2, getdate() into table1

答案 3 :(得分:1)

为其设置默认值:

CREATE TABLE dbo.YourTable
    (
    columns....,
    YourDateTime datetime NOT NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.YourTable ADD CONSTRAINT
    DF_YourTable_YourDateTime DEFAULT GETDATE() FOR YourDateTime

当INSERT没有列出该列时:

INSERT INTO dbo.YourTable (columns...) VALUES (values...)

或INSERT列出该列时,但使用DEFAULT关键字:

INSERT INTO dbo.YourTable (columns...,YourDateTime) VALUES (values...,DEFAULT)

或当您INSERT列出该列,并使用GETDATE()或其他一些日期时间时:

INSERT INTO dbo.YourTable (columns...,YourDateTime) VALUES (values...,'1/1/2010 12:34:56')

答案 4 :(得分:1)

如您所见,您有多种解决方案。简而言之,

  1. 您可以编写您的方法(在VBNET中),将相应的字段设置为System.DateTime.Now(不是最佳实践);

    Public Function InsertObject(o As Object) As Integer
        cmd.CommandText = String.Format("INSERT INTO table_name (Id, CreationDate) VALUES (1, {0})", System.DateTime.Now)
        Return cmd.ExecuteNonQuery()
    End Function
    
  2. 您可以编写INSTEAD OF INSERT触发器并使用GETDATE()替换CreationDate插入值(推荐方式);

    CREATE TRIGGER trg_bi_PersistObject
    ON objectToPersistTable
    INSTEAD OF INSERT AS
        insert into objectToPersistTable (Id, CreationDate) (
            select Id, GETDATE()
                from inserted
        )
    

    (请考虑代码是我的头脑。为了语法目的,可能需要一些修复。这至少为您提供了主要想法。)

  3. 您可以设置默认值(但由于某些原因,它似乎不适合您。)

    (参见David M或KM的代码答案)。

  4. 如paxdiablo对自己答案的评论中所述,此类功能应在DBMS端处理,以避免应用程序客户端的数据损坏。然后,我打赌你更好的选择可能是2.,创建一个BEFORE INSERT触发器并使用GETDATE()函数设置它的值。

答案 5 :(得分:0)

如果您正在使用复制,请小心。我不熟悉SQL Server复制的内部细节,但我知道对于某些形式的MySQL复制,如果使用NOW()作为默认值或使用相同函数的触发器,日期将在出版商和订户数据库。

如果在应用程序中设置日期,则日期始终可以复制。当然,需要注意的是,日期或时间应该从应用程序(或Web)服务器设置,因为最终用户的计算机上的日期和时间不可信任。

如果您正在使用复制,则可能需要对此进行测试。