2014-06-13 88 views
0

我想向表中添加新的创建时间列。但是,我希望表中所有以前的条目显示'19700101'日期,而从此点开始的所有新条目(即引入新列后)应显示当前日期,方法是使用getDate()如何创建具有不同行为的创建时间列

+1

为什么-1,为什么关闭它。要么告诉我为什么这不是一个有效的问题,或者如果它已经在stackoverflow – LivingThing

+0

首先创建默认为'19700101'的列。然后改变列并将默认值改为GetDate()。简单的 – Roopesh

+0

我已经试过,它不工作。如果你看到一点点,那么你会明白为什么它不工作:)。即使它工作,它也会将所有以前的值更改为当前日期。 – LivingThing

回答

2

@ Roopesh的意见做的工作只是罚款:

create table T (ID int not null,Col1 varchar(9) not null) 
go 
insert into T(ID,Col1) values (1,'abc'),(2,'def') 
go 
alter table T add CreatedDate date not null constraint DF_tmp default '19700101' 
go 
alter table T drop constraint DF_tmp 
go 
alter table T add constraint DF_Permanent 
    DEFAULT CURRENT_TIMESTAMP for CreatedDate 
go 
insert into T(ID,Col1) values (3,'ghi') 
go 
select * from T 

结果是:

ID   Col1  CreatedDate 
----------- --------- ----------- 
1   abc  1970-01-01 
2   def  1970-01-01 
3   ghi  2014-06-13 

这样做的好处是,列不允许NULL秒。如果你使用Mikael's approach,你可以使列不为空的,你已经应用了UPDATE后,但是这将需要对表的两个扫描(一次应用UPDATE,第二次来检查任何NULL小号当制作列not null)。

+0

+1。对于我的答案,'not null'方法更可能仅仅是添加一个'not null'列,然后替换所有值,就像它只是从'null'而不是从一个值完成的那样。不过,你的方法当然会更快,因为它正在更新一些元数据,而不是替换表中的所有值。 –

1

第一添加具有默认值getdate()

alter table YourTable add createddate date default getdate() 

默认值未在此步骤中施加的列。每行有null作为createddate的值。

对于所有行,将createddate的值更新为1970-01-01

update YourTable set createddate = '1970-01-01' 
1
--Create Table 
CREATE TABLE [dbo].[MyTestTable](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](50) NOT NULL, 
) ON [PRIMARY] 

GO 

--Put in some data 
INSERT INTO [MyTestTable] (Name) VALUES ('Eoin') 
INSERT INTO [MyTestTable] (Name) VALUES ('Living Thing') 

GO 

-- Add a new column datetime with a default value of min date 
ALTER TABLE dbo.MyTestTable ADD 
    CreatedDate datetime NOT NULL CONSTRAINT DF_MyTestTable_CreatedDate DEFAULT Convert(Datetime, '19700101') 
GO 

-- Existing Records are now updated to Jan 1970 
SELECT * FROM MyTestTable 
GO 
-- Alter the table again but with a new default 
ALTER TABLE dbo.MyTestTable 
    DROP CONSTRAINT DF_MyTestTable_CreatedDate 
GO 
ALTER TABLE dbo.MyTestTable ADD CONSTRAINT 
    DF_MyTestTable_CreatedDate DEFAULT getdate() FOR CreatedDate 
GO 

--Put in some more data. 

INSERT INTO [MyTestTable] (Name) VALUES ('John') 

GO 

-- newer Records are now updated to current date 
SELECT * FROM MyTestTable 
GO