使用创建行的日期自动填充SQL数据表中的datetime列的最简单方法是什么?如果重要,请使用SQL Server 2005.
编辑:我尝试使用GETDATE()作为默认值,并且适用于INSERT查询,但不适用于TableAdapter添加行。
答案 0 :(得分:5)
ALTER TABLE table
ADD column NOT NULL DEFAULT (GETDATE())
答案 1 :(得分:2)
您应该创建列并拥有:
任何默认值解决方案都不安全,因为可以通过在插入或之后更改列时专门设置列来绕过它。基于触发器的解决方案将控件与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)
如您所见,您有多种解决方案。简而言之,
您可以编写您的方法(在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
您可以编写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
)
(请考虑代码是我的头脑。为了语法目的,可能需要一些修复。这至少为您提供了主要想法。)
您可以设置默认值(但由于某些原因,它似乎不适合您。)
(参见David M或KM的代码答案)。
如paxdiablo对自己答案的评论中所述,此类功能应在DBMS端处理,以避免应用程序客户端的数据损坏。然后,我打赌你更好的选择可能是2.,创建一个BEFORE INSERT触发器并使用GETDATE()函数设置它的值。
答案 5 :(得分:0)
如果您正在使用复制,请小心。我不熟悉SQL Server复制的内部细节,但我知道对于某些形式的MySQL复制,如果使用NOW()作为默认值或使用相同函数的触发器,日期将在出版商和订户数据库。
如果在应用程序中设置日期,则日期始终可以复制。当然,需要注意的是,日期或时间应该从应用程序(或Web)服务器设置,因为最终用户的计算机上的日期和时间不可信任。
如果您正在使用复制,则可能需要对此进行测试。