Thêm giá trị mặc định của trường datetime trong SQL Server vào dấu thời gian


265

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

Tôi biết nó ở đâu đó, nhưng dường như tôi không thể tìm 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 đặt nó ở đâu.


Cẩn thận với các múi giờ: stackoverflow.com/a/31296917/57475
Tanner

Câu trả lời:


332

Để 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

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

@steph - TheQCâu trả lời của bạn cho rằng bạn đang thay đổi một cột hiện có 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.
Martin Smith

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

@TheQ - Thật hoàn hảo, tôi sẽ thử. Bạn đã đúng, tôi đã có trường, nhưng tôi muốn áp dụng bản sửa lỗi cho nó, không tạo một cái mới. Cảm ơn tất cả các câu trả lời của bạn!
stephmoreland

6
Nếu bạn muốn dấu thời gian UTC thay vì giờ địa phương, bạn có thể sử dụng GETUTCDATE()thay vìGETDATE()
Cocowalla

147

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

  1. Đặt bảng của bạn trong dạng xem thiết kế (Nhấp chuột phải vào bảng trong trình thám hiểm đối tượng-> Thiết kế )
  2. Thêm một cột vào bảng (hoặc nhấp vào cột bạn muốn cập nhật nếu nó đã tồn tại)
  3. Trong Thuộc tính Cột, nhập (getdate())vào Giá trị mặc định hoặc trường liên kết như hình dưới đây

Hình ảnh của bảng trong thiết kế xem


Câu hỏi hay. Tôi sẽ thử dateadd(minute, 10, GetDate())xem nếu nó hoạt động.
Tony L.

Trong quan điểm thiết kế máy chủ sql tôi đã thử nó, nó nói giá trị phải phù hợp với một trong các mục trong danh sách! vì vậy tôi đã thực hiện nó ở mặt sau
chia sẻ

92

Trong bảng đó trong SQL Server, chỉ đị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
);

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à thời gian.
Sindri Traustason

TIMESTAMP sẽ cung cấp cho bạn một đầu vào như thế này: yyyy-mm-dd 00:00:00 UTC; và điều đó có thể làm cho DB rất lớn; tôi nghĩ rằng anh ta chỉ có nghĩa là ngày yyyy-mm-dd; và giá trị mặc định cho nó có thể được đặt bằng cách nhấp vào "Như được xác định là" trong chế độ xem bình thường của phpmyadmin
Amine

@Amine, TIMESTAMP là một giá trị nhị phân, thường sử dụng 6-8 byte. Biểu diễn chuỗi chỉ là một biểu diễn, giống như cơ sở dữ liệu không lưu trữ số nguyên dưới dạng chuỗi. (Trừ khi bạn đặt thời gian vào cột VARCHAR và sẽ là những người cố gắng.)
SilverbackNet

1
Tôi lưu ý rằng CURRENT_TIMESTAMPtrả về một datetimegiá trị trong múi giờ địa phương của máy tính. Nó nên được tránh. Thay vào đó sử dụng SYSUTCDATETIMEmà trả về một datetime2trong UTC.
Đại

28

Trong khi câu trả lời được đánh dấu là đúng với:

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

Bạn phải luôn luôn biết về các múi giờ khi thêm các giá trị thời gian mặc định vào một cột.

Ví dụ, datetimegiá trị này được thiết kế để cho biết khi thành viên tham gia trang web và bạn muốn nó được hiển thị lại cho người dùng, GETDATE()sẽ cho bạn thời gian máy chủ để có thể hiển thị sự khác biệt nếu người dùng ở một địa điểm khác với máy chủ.

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

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

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

Khi truy xuất các giá trị, ứng dụng / trang web giao diện người dùng sẽ chuyển đổi giá trị này từ thời gian UTC sang ngôn ngữ / văn hóa của người dùng yêu cầu nó.


19

Không cho phép Nulls trên cột và đặt mặc định trên cột của 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

Làm thế nào bạn thay đổi điều đó để thay đổi trường hiện tại "created_date"?
stephmoreland

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

8

Cú pháp cho việc này khi tạo bảng mới là:

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

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)

Nó hoạt động tốt như nhau trong câu lệnh ALTER TABLE khi thêm một cột mới.
Thuyền trưởng Sensible

7

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

ALTER TABLE [accounts] 
 ADD [user_registered] DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;

4

Điều này cũng hoạt động:

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

Hoặc là:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE();

4

Điều này làm việc cho tôi. Tôi đang sử dụng SQL Developer với Oracle DB:

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;

2

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

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

bạn muốn thêm một cột mới vào bảng trong đó mỗi lần có chèn ... thì cột đó sẽ ghi lại thời gian xảy ra sự kiện.

Giải pháp:

thêm một cột mới, giả sử timepurchase là cột mới, vào bảng có datetime kiểu dữ liệu .

Sau đó chạy các thay đổi sau:

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

1

Giả sử 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)
);

Bây giờ 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 một dấu thời gian khi họ đăng ký.

Nếu ứng dụng này được giới hạn trong một khu vực địa phương 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ự cân nhắc của Tanner cho khán giả toàn cầu với GETUTCDATE()giá trị mặc định.

Thêm cột với giá trị mặc định trong một câu như câu trả lời này .

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

Hãy lấy một 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

0

Trong SQLPlus trong khi tạo bảng, nó giống như

Kiểm tra SQL> tạo bảng

 ( Test_ID number not null,
   Test_Date date default sysdate not null );

SQL> chèn vào các giá trị Test (id) (1);

 Test_ID Test_Date
       1 08-MAR-19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.