【发布时间】:2011-06-20 18:30:21
【问题描述】:
我有一个收集从我们网站提交的表格的表格,但由于某种原因,当他们创建表格时,他们没有在表格中放置时间戳。我希望它输入输入记录的确切日期和时间。
我知道它在某处,但我似乎找不到如何设置默认值(如在 Access 中,您使用 getNow() 或 Now())但我不知道将其放在哪里。
【问题讨论】:
标签: sql-server datetime
我有一个收集从我们网站提交的表格的表格,但由于某种原因,当他们创建表格时,他们没有在表格中放置时间戳。我希望它输入输入记录的确切日期和时间。
我知道它在某处,但我似乎找不到如何设置默认值(如在 Access 中,您使用 getNow() 或 Now())但我不知道将其放在哪里。
【问题讨论】:
标签: sql-server datetime
用于修改现有表中的现有列:
ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn
【讨论】:
TheQ 的回答假设您正在更改我不认为是这种情况的现有列?有关使用此默认约束添加新列的代码,请参阅我的答案。
GETUTCDATE()而不是GETDATE()
在 SQL Server 的该表中,将该列的默认值指定为 CURRENT_TIMESTAMP。
该列的数据类型可能是datetime 或datetime2。
例如
Create Table Student
(
Name varchar(50),
DateOfAddmission datetime default CURRENT_TIMESTAMP
);
【讨论】:
CURRENT_TIMESTAMP 在计算机的本地时区返回一个datetime 值。应该避免。而是使用SYSUTCDATETIME,它在UTC 中返回datetime2。
虽然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 时间转换为请求它的用户的语言环境/文化。
【讨论】:
DateTime2 而不是 DateTime。因此,您应该使用 SYSUTCDATETIME 来获取 UTC 日期,因为它具有更好的精度。如果您需要本地服务器时间,那么您应该考虑使用SYSDATETIMEOFFSET 来获取本地时间并存储偏移量。在这种情况下使用DateTimeOffset 类型。
不允许在列上使用 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
【讨论】:
DEFAULT GETDATE() 是否保证多行 INSERT 对于所有插入的行都具有相同的 DATE,或者是否可以对每行评估 GETDATE?同样对于SYSDATETIME()?
创建新表时的语法是:
CREATE TABLE MyTable
(
MYTableID INT IDENTITY(1,1),
CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)
【讨论】:
这对我有用...
ALTER TABLE [accounts]
ADD [user_registered] DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;
【讨论】:
这也有效:
CREATE TABLE Example(
...
created datetime default GETDATE()
);
或者:
ALTER TABLE EXAMPLE ADD created datetime default GETDATE();
【讨论】:
这对我有用。我正在使用带有 Oracle DB 的 SQL Developer:
ALTER TABLE YOUR_TABLE
ADD Date_Created TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL;
【讨论】:
为了便于理解,我将总结以上答案:
假设该表名为 Customer 它有 4 列/更少或更多...
您想在每次插入时向表中添加一个新列...然后该列记录事件发生的时间。
解决方案:
添加一个新列,假设 timepurchase 是新列,添加到数据类型为 datetime 的表中。
然后运行以下更改:
ALTER TABLE Customer ADD CONSTRAINT DF_Customer DEFAULT GETDATE() FOR timePurchase
【讨论】:
假设您为注册系统创建了一个数据库表。
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
【讨论】:
在 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
【讨论】: