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

Posted

技术标签:

【中文标题】将 SQL Server 中 datetime 字段的默认值添加到时间戳【英文标题】:Add default value of datetime field in SQL Server to a timestamp 【发布时间】:2011-06-20 18:30:21 【问题描述】:

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

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

【问题讨论】:

注意时区:***.com/a/31296917/57475 【参考方案1】:

用于修改现有表中的现有列:

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

【讨论】:

@TheQ - 谢谢。我知道我将“YourTable”更改为我的表名,但我不明白的部分是约束。什么是约束,我会修改您的代码以匹配我的表的名称吗? @steph - TheQ 的回答假设您正在更改我不认为是这种情况的现有列?有关使用此默认约束添加新列的代码,请参阅我的答案。 为了让一个列有一个默认值,它需要一个“默认约束”,这个命令将添加它。您可以随意命名约束,Management Studio 通常将它们命名为 DF_TableName。 @TheQ - 太完美了,我会试试的。你是对的,我已经有了这个领域,但我想对它应用修复,而不是创建一个新的。感谢您的所有回答! 如果你想要UTC时间戳而不是本地时间,你可以使用GETUTCDATE()而不是GETDATE()【参考方案2】:

这也可以通过 SSMS GUI 完成。

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

【讨论】:

好问题。我会尝试dateadd(minute, 10, GetDate()) 看看是否可行。 在 sql server 设计视图中我试过了,它说值必须与列表中的项目之一匹配!所以我在后端做了它 我试过这个但我得到0001-01-01T00:00:00而不是当前日期【参考方案3】:

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

例如

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

【讨论】:

此操作失败并显示错误消息“无法在 [B 和 TIMESTAMP] 之间转换”。 CURRENT_TIMESTAMP 似乎是一个二进制值,而不是日期时间。 TIMESTAMP 会给你这样的输入:yyyy-mm-dd 00:00:00 UTC;这可以使数据库变得如此之大;我认为他的意思只是日期 yyyy-mm-dd;并且可以通过在phpmyadmin的普通视图中单击“定义为”来设置它的默认值 @Amine,TIMESTAMP 是一个二进制值,通常使用 6-8 个字节。字符串表示只是一种表示,就像数据库不将整数存储为字符串一样。 (除非你把时间放在一个 VARCHAR 列中,否则那些尝试的人有祸了。) 我注意到CURRENT_TIMESTAMP 在计算机的本地时区返回一个datetime 值。应该避免。而是使用SYSUTCDATETIME,它在UTC 中返回datetime2【参考方案4】:

虽然marked answer 是正确的:

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

在向列中添加默认日期时间值时,您应该始终注意时区。

例如,这个datetime 值旨在指示成员何时加入网站并且您希望将其显示给用户,GETDATE() 将为您提供服务器时间,因此如果用户可能会显示差异与服务器处于不同的语言环境中。

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

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

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

在检索值时,前端应用程序/网站应将此值从 UTC 时间转换为请求它的用户的语言环境/文化。

【讨论】:

好建议。但是,为了补充这一点,Microsoft 建议您使用 DateTime2 而不是 DateTime。因此,您应该使用 SYSUTCDATETIME 来获取 UTC 日期,因为它具有更好的精度。如果您需要本地服务器时间,那么您应该考虑使用SYSDATETIMEOFFSET 来获取本地时间并存储偏移量。在这种情况下使用DateTimeOffset 类型。【参考方案5】:

不允许在列上使用 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”? @steph - 见编辑。我之前的回答认为这是一个新专栏。您需要禁止 NULL 才能使默认值起作用,那么您希望如何处理预先存在的行? DEFAULT GETDATE() 是否保证多行 INSERT 对于所有插入的行都具有相同的 DATE,或者是否可以对每行评估 GETDATE?同样对于SYSDATETIME()?【参考方案6】:

创建新表时的语法是:

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 ;

【讨论】:

【参考方案8】:

这也有效:

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

或者:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE();

【讨论】:

【参考方案9】:

这对我有用。我正在使用带有 Oracle DB 的 SQL Developer:

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;

【讨论】:

【参考方案10】:

为了便于理解,我将总结以上答案:

假设该表名为 Customer 它有 4 列/更少或更多...

您想在每次插入时向表中添加一个新列...然后该列记录事件发生的时间。

解决方案:

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

然后运行以下更改:

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

【讨论】:

【参考方案11】:

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

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's consideration 为全球观众,GETUTCDATE() 为默认值。

在this answer 等语句中添加具有默认值的列。

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

【讨论】:

【参考方案12】:

在 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

【讨论】:

以上是关于将 SQL Server 中 datetime 字段的默认值添加到时间戳的主要内容,如果未能解决你的问题,请参考以下文章

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

将 char 数据类型转换为 datetime 数据类型导致 SQL Server 2005 中的 datetime 值超出范围

SQL Server 算术溢出错误 - 将 nvarchar 转换为 datetime

如何使用 SQL 将 Sql Server DateTime 转换为通用时间

如何将 Sql Server 2008 DateTimeOffset 转换为 DateTime

C# 将 DateTime 转换为 Sql Server 2005 格式