将SQL Server中的datetime字段的默认值添加到时间戳


265

我有一个表格,用于收集从我们的网站提交的表单,但是由于某些原因,当他们创建表格时,他们并没有在表格中添加时间戳。我希望它输入输入记录的确切日期和时间。

我知道它在某处,但是我似乎找不到如何设置默认值(例如在Access中,您使用getNow()Now()),但我不知道将其放置在何处。


Answers:


332

要修改现有表中的现有列:

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn

2
@TheQ-谢谢。我知道我将“ YourTable”更改为表名,但是我不明白的部分是约束。有什么约束,我将修改您的代码以匹配表名吗?
stephmoreland 2011年

@steph- TheQ的答案假设您正在更改现有列,但我认为情况并非如此?请参阅我的代码答案,以使用此默认约束添加新列。
马丁·史密斯

1
为了使列具有默认值,它需要一个“默认约束”,并且此命令将添加它。您可以随意命名约束,Management Studio通常将其命名为DF_TableName。
TheQ 2011年

@TheQ-太好了,我会尝试的。您是对的,我已经有了该字段,但是我想对此应用修复,而不是创建新的修复。感谢您的所有回答!
stephmoreland'2

6
如果你想UTC时间戳,而不是本地时间,你可以使用GETUTCDATE(),而不是GETDATE()
Cocowalla

147

这也可以通过SSMS GUI来完成。

  1. 将表放入设计视图(在对象资源管理器-> 设计中右键单击表)
  2. 在表中添加一列(如果已经存在,请单击要更新的列)
  3. 在“列属性”中,输入(getdate())默认值”或“绑定”字段,如下图所示

设计视图中的表格图像


好问题。我会尝试dateadd(minute, 10, GetDate())看看是否可行。
托尼L.19年

我在sql server设计视图中尝试过,它说值必须匹配列表中的一项!所以我在后端进行了
shareef

92

在SQL Server的该表中,将该列的默认值指定为CURRENT_TIMESTAMP。该列的数据类型可以是datetime或datetime2。

例如

Create Table Student
(
  Name varchar(50),
  DateOfAddmission datetime default CURRENT_TIMESTAMP
);

1
这将失败,并显示错误消息“无法在[B和TIMESTAMP]之间转换”。似乎CURRENT_TIMESTAMP是一个二进制值,而不是日期时间。
Sindri Traustason

TIMESTAMP会给您这样的输入:yyyy-mm-dd 00:00:00 UTC; 这会使数据库如此之大;我认为他的意思只是日期yyyy-mm-dd; 和默认值可以通过在phpmyadmin的普通视图中单击“定义为”来设置
Amine

@ Amine,TIMESTAMP是一个二进制值,通常使用6-8个字节。字符串表示形式就是一种表示形式,就像数据库不将整数存储为字符串一样。(除非您将时间放在VARCHAR列中,否则请尝试做这些。)
SilverbackNet

1
我注意到,这会在计算机的本地时区中CURRENT_TIMESTAMP返回一个datetime值。应该避免。而是使用UTC SYSUTCDATETIME返回datetime2UTC。

28

虽然标记的答案是正确的:

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn

向列中添加默认datetime值时,应始终注意时区。

举例来说,此datetime值旨在指示成员何时加入网站,并且您希望将其显示给用户,这GETDATE()将为您提供服务器时间,因此如果用户位于服务器的其他区域中,则可能会显示差异。

如果您希望与国际用户打交道,则在某些情况下,最好使用GETUTCDATE()

返回当前数据库系统时间戳作为日期时间值。不包括数据库时区偏移量。此值表示当前UTC时间(世界标准时间)。此值是从运行SQL Server实例的计算机的操作系统派生的。

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETUTCDATE() FOR YourColumn

检索值时,前端应用程序/网站应将此值从UTC时间转换为请求该值的用户的区域设置/区域性。


19

在该列上禁止Null,并在以下列上设置默认值 getdate()

/*Deal with any existing NULLs*/
UPDATE YourTable SET created_date=GETDATE() /*Or some sentinel value 
                                                '19000101' maybe?*/
WHERE created_date IS NULL


/*Disallow NULLs*/
ALTER TABLE YourTable ALTER COLUMN created_date DATE NOT NULL

/*Add default constraint*/
ALTER TABLE YourTable ADD CONSTRAINT
    DF_YourTable_created_date DEFAULT GETDATE() FOR created_date

您将如何更改它以更改现有字段“ created_date”?
stephmoreland'2

@steph-请参阅编辑。我以前的答案认为这是一本新专栏。您将需要禁止使用NULL才能使默认值正常工作,那么如何处理已有的行呢?
马丁·史密斯,

8

创建新表时的语法为:

CREATE TABLE MyTable
(
    MYTableID INT IDENTITY(1,1),

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)

添加新列时,它在ALTER TABLE语句中同样有效。
明智船长

7

这对我有用...

ALTER TABLE [accounts] 
 ADD [user_registered] DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;

4

这也适用:

CREATE TABLE Example(
...
created datetime default GETDATE()
);

要么:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE();

4

这对我有用。我将SQL Developer与Oracle DB配合使用:

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;

2

为了更容易理解,我将总结以上答案:

假设该表称为“ 客户”, 它有4列/更少或更多...

您想在每次插入时向表中添加一个新列...,那么该列将保留事件发生时间的记录。

解:

在数据类型为datetime的表中添加一个新列(假设timepurchase是新列)。

然后运行以下更改:

ALTER TABLE Customer ADD CONSTRAINT DF_Customer DEFAULT GETDATE() FOR timePurchase

1

假设您为注册系统创建了一个数据库表。

IF OBJECT_ID('dbo.registration_demo', 'U') IS NOT NULL 
  DROP TABLE dbo.registration_demo; 

CREATE TABLE dbo.registration_demo (
    id INT IDENTITY PRIMARY KEY,
    name NVARCHAR(8)
);

现在有几个人注册。

INSERT INTO dbo.registration_demo (name) VALUES
    ('John'),('Jane'),('Jeff');

然后您意识到他们需要一个时间戳记。

如果此应用仅限于地理区域,则可以将本地服务器时间与一起使用GETDATE()。否则,您应该使用默认值来关注Tanner对于全球受众的考虑GETUTCDATE()

在一个像这样的答案的语句中添加具有默认值的列。

ALTER TABLE dbo.registration_demo
ADD time_registered DATETIME DEFAULT GETUTCDATE();

让我们再找一个注册者,看看数据是什么样的。

INSERT INTO dbo.registration_demo (name) VALUES
    ('Julia');

SELECT * FROM dbo.registration_demo;
id    name    time_registered
1     John    NULL
2     Jane    NULL
3     Jeff    NULL
4     Julia   2016-06-21 14:32:57.767

0

在SQLPlus中创建表时就像

SQL>创建表测试

 ( Test_ID number not null,
   Test_Date date default sysdate not null );

SQL>插入Test(id)值(1);

 Test_ID Test_Date
       1 08-MAR-19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.