2011-02-03 41 views
151

Tôi có một bảng thu thập biểu mẫu được gửi từ trang web của chúng tôi, nhưng vì lý do nào đó, khi họ tạo bảng, họ không đặt dấu thời gian vào bảng . Tôi muốn nó nhập chính xác ngày và thời gian mà hồ sơ đã được nhập vào.Thêm giá trị mặc định của trường datetime trong SQL Server vào dấu thời gian

Tôi biết nó ở đâu đó, nhưng dường như tôi không biết cách đặt giá trị mặc định (như trong Access, bạn sử dụng getNow() hoặc Now()) nhưng tôi không biết phải đặt ở đâu.

Trả lời

214

Đối với sửa đổi một cột hiện có trong một bảng hiện có:

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

@TheQ - Cảm ơn. Tôi hiểu rằng tôi thay đổi "YourTable" thành tên bảng của tôi, nhưng phần tôi không hiểu là Hạn chế. Ràng buộc là gì và tôi có sửa đổi mã của bạn để khớp với tên bảng của tôi không? – stephmoreland

+0

@steph - Câu trả lời của 'TheQ' giả định bạn đang thay đổi cột hiện tại mà tôi không tin là trường hợp đó? Xem câu trả lời của tôi cho mã để thêm một cột mới với ràng buộc mặc định này. –

+1

Để một cột có giá trị mặc định, cột cần "ràng buộc mặc định" và lệnh này sẽ thêm giá trị đó. Bạn có thể đặt tên cho ràng buộc bất cứ thứ gì bạn thích, Management Studio thường đặt tên chúng là DF_TableName. – TheQ

15

Disallow Nulls trên cột và thiết lập một mặc định trên các cột của getdate()

/*Deal with any existing NULLs*/ 
UPDATE YourTable SET created_date=GETDATE() /*Or some sentinel value 
               '19000101' maybe?*/ 

/*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 
+0

Làm thế nào bạn sẽ làm thay đổi đó để thay đổi lĩnh vực đang tồn tại "CREATED_DATE"? – stephmoreland

+0

@steph - Xem Chỉnh sửa. Câu trả lời trước của tôi cho rằng đây là một cột mới. Bạn sẽ cần phải không cho phép NULL cho mặc định để làm việc vì vậy làm thế nào để bạn muốn hàng tồn tại từ trước để được điều trị? –

62

Trong đó bảng trong SQL Server, xác định giá trị mặc định của cột đó là CURRENT_TIMESTAMP. Kiểu dữ liệu của cột đó có thể là datetime hoặc datetime2.

ví dụ:

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

Tôi hy vọng nó sẽ hoạt động.

+1

Điều này không thành công với thông báo lỗi "Không thể chuyển đổi giữa [B và TIMESTAMP]". Có vẻ như CURRENT_TIMESTAMP là một giá trị nhị phân, không phải là một ngày giờ. –

+0

Dấu thời gian sẽ cung cấp cho bạn một đầu vào như sau: yyyy-mm-dd 00:00:00 UTC; và điều đó có thể làm cho DB quá lớn; tôi nghĩ anh ta chỉ có nghĩa là ngày yyyy-mm-dd; và giá trị mặc định cho nó có thể được thiết lập bằng cách nhấp vào "As Defined as" trong giao diện bình thường của phpmyadmin – Amine

5

Cú pháp cho điều này khi tạo một bảng mới là:

CREATE TABLE MyTable 
(
    MYTableID INT IDENTITY(1,1), 

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE() 
) 
+0

Nó hoạt động tốt như nhau trong câu lệnh ALTER TABLE khi thêm một cột mới. –

2

Để làm cho nó đơn giản để làm theo, tôi sẽ Tóm tắt câu trả lời ở trên:

Giả sử bảng được gọi là Cutomer nó có 4 cột/ít hơn hoặc nhiều hơn ...

bạn muốn thêm cột mới vào bảng nơi mọi lúc khi có chèn ... thì cột đó giữ kỷ lục về thời gian xảy ra sự kiện.

Giải pháp:

thêm cột mới, ta hãy nói timePurchase là cột mới, để bàn với kiểu dữ liệu datetime .

Sau đó chạy bàn thờ sau:

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

này cũng có thể được thực hiện thông qua SSMS GUI.

  1. Đặt bảng của bạn theo quan điểm thiết kế (Nhấp chuột phải vào bảng trong đối tượng Explorer->Thiết kế)
  2. Thêm một cột vào bảng (hoặc click vào cột bạn muốn cập nhật nếu nó đã tồn tại)
  3. trong Properties Cột, nhập (getdate()) trong Giá trị mặc định hoặc Binding lĩnh vực như hình dưới đây

enter image description here

+1

Mỗi khi tôi quay lại đây chỉ để xác minh cách tôi thực hiện nó trong GUI. Cảm ơn bạn Tony. – Daidon

11

Trong khi marked answer là đúng với:

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

Bạn nên luôn luôn được nhận thức của các múi giờ khi thêm giá trị datetime mặc định vào một cột.

Nói ví dụ, giá trị datetime này được thiết kế để cho biết khi nào một thành viên tham gia vào một trang web và bạn muốn nó được hiển thị lại cho người dùng, GETDATE() sẽ cung cấp cho bạn thời gian máy chủ để có thể hiển thị sai lệch nếu người dùng đang ở trong một miền địa phương khác với máy chủ.

Nếu bạn mong đợi để đối phó với người dùng quốc tế, nó là tốt hơn trong một số trường hợp sử dụng GETUTCDATE(), trong đó:

Trả về hệ thống cơ sở dữ liệu timestamp hiện tại như một giá trị datetime. Không bao gồm chênh lệch múi giờ của cơ sở dữ liệu. Giá trị này đại diện cho thời gian UTC hiện tại (Giờ quốc tế phối hợp). Giá trị này bắt nguồn từ hệ điều hành của máy tính mà trên đó cá thể của SQL Server đang chạy.

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

Khi lấy các giá trị, ứng dụng kết thúc/trang web trước nên chuyển đổi giá trị này từ thời gian tính theo giờ UTC đến ngôn ngữ/văn hóa của người dùng yêu cầu nó.

2

này cũng hoạt động:

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

Hoặc:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE(); 
1

Hãy nói rằng bạn tạo một bảng cơ sở dữ liệu cho một hệ thống đăng ký.

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) 
); 

Hiện tại, có một vài người đăng ký.

INSERT INTO dbo.registration_demo (name) VALUES 
    ('John'),('Jane'),('Jeff'); 

Sau đó, bạn nhận ra rằng bạn cần dấu thời gian khi đăng ký.

Nếu ứng dụng này bị giới hạn ở khu vực địa lý được địa lý hóa, thì bạn có thể sử dụng thời gian máy chủ cục bộ với GETDATE(). Nếu không, bạn nên chú ý đến số Tanner's consideration cho đối tượng chung với GETUTCDATE() cho giá trị mặc định.

Thêm cột có giá trị mặc định trong một tuyên bố như this answer.

ALTER TABLE dbo.registration_demo 
ADD time_registered DATETIME DEFAULT GETUTCDATE(); 

Hãy tìm người đăng ký khác và xem dữ liệu trông như thế nào.

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 
2

này làm việc cho tôi ...

ALTER TABLE `accounts` ADD `user_registered` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ; 
Các vấn đề liên quan