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

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

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

【问题讨论】:

标签: sql-server datetime


【解决方案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 完成。

  1. 将表格放入设计视图(在对象资源管理器中右键单击表格->设计
  2. 向表中添加一列(如果已存在,请单击要更新的列)
  3. 在列属性中,在默认值中输入(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
            

            【讨论】:

              猜你喜欢
              • 2014-07-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-29
              • 2015-03-02
              • 1970-01-01
              • 2019-05-02
              • 1970-01-01
              相关资源
              最近更新 更多