将 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
。
该列的数据类型可能是datetime
或datetime2
。
例如
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 转换为通用时间