เพิ่มค่าเริ่มต้นของเขตข้อมูลวันที่และเวลาใน SQL Server ให้กับการประทับเวลา


265

ฉันมีตารางที่รวบรวมฟอร์มที่ส่งมาจากเว็บไซต์ของเรา แต่ด้วยเหตุผลบางอย่างเมื่อพวกเขาสร้างตารางพวกเขาไม่ได้วางเวลาลงในตาราง ฉันต้องการให้ป้อนวันและเวลาที่แน่นอนที่บันทึก

ฉันรู้ว่ามันอยู่ในนั้น แต่ฉันไม่สามารถหาวิธีตั้งค่าเริ่มต้นได้ (เช่นใน Access, คุณใช้getNow()หรือNow()) แต่ไม่รู้ว่าจะใส่ไว้ที่ไหน


ระวังเขตเวลา: stackoverflow.com/a/31296917/57475
แทนเนอร์

คำตอบ:


332

สำหรับการแก้ไขคอลัมน์ที่มีอยู่ในตารางที่มีอยู่:

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

2
@TheQ - ขอบคุณ ฉันเข้าใจว่าฉันเปลี่ยน "YourTable" เป็นชื่อตารางของฉัน แต่ส่วนที่ฉันไม่เข้าใจคือข้อ จำกัด ข้อ จำกัด คืออะไรและฉันจะแก้ไขรหัสของคุณให้ตรงกับชื่อตารางของฉันหรือไม่
stephmoreland

@steph - TheQคำตอบสมมติว่าคุณกำลังแก้ไขคอลัมน์ที่มีอยู่ซึ่งฉันไม่เชื่อว่าจะเป็นเช่นนั้นหรือ ดูคำตอบของฉันสำหรับรหัสเพื่อเพิ่มคอลัมน์ใหม่ด้วยข้อ จำกัด เริ่มต้นนี้
Martin Smith

1
เพื่อให้คอลัมน์มีค่าเริ่มต้นจำเป็นต้องมี "ข้อ จำกัด เริ่มต้น" และคำสั่งนี้จะเพิ่มเข้าไป คุณสามารถตั้งชื่อข้อ จำกัด ได้ตามที่คุณต้องการ Studio จัดการมักจะตั้งชื่อพวกเขาว่า DF_TableName
TheQ

@TheQ - สมบูรณ์แบบฉันจะลองดู คุณพูดถูกฉันมีฟิลด์อยู่แล้ว แต่ฉันต้องการใช้การแก้ไขกับมันไม่ใช่สร้างใหม่ ขอบคุณสำหรับคำตอบทั้งหมดของคุณ!
stephmoreland

6
หากคุณต้องการเวลา UTC แทนเวลาท้องถิ่นคุณสามารถใช้GETUTCDATE()แทนGETDATE()
Cocowalla

147

สิ่งนี้สามารถทำได้ผ่าน SSMS GUI

  1. วางตารางของคุณในมุมมองออกแบบ (คลิกขวาบนตารางใน Object explorer-> Design )
  2. เพิ่มคอลัมน์ในตาราง (หรือคลิกที่คอลัมน์ที่คุณต้องการอัปเดตหากมีอยู่แล้ว)
  3. ในคุณสมบัติคอลัมน์ให้ป้อน(getdate())ในค่าเริ่มต้นหรือเขตข้อมูลการเชื่อมตามภาพด้านล่าง

รูปภาพของตารางในมุมมองออกแบบ


คำถามที่ดี. ฉันจะลองdateadd(minute, 10, GetDate())ดูว่าใช้งานได้หรือไม่
Tony L.

ในมุมมองการออกแบบเซิร์ฟเวอร์ sql ฉันลองมันมันบอกว่าค่าจะต้องตรงกับหนึ่งในรายการในรายการ! ดังนั้นฉันจึงทำที่ด้านหลัง
shareef

92

ในตารางนั้นใน SQL Server ให้ระบุค่าเริ่มต้นของคอลัมน์CURRENT_TIMESTAMPนั้น ประเภทข้อมูลของคอลัมน์นั้นอาจเป็น datetime หรือ datetime2

เช่น

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

1
สิ่งนี้ล้มเหลวด้วยข้อความแสดงข้อผิดพลาด "ไม่สามารถแปลงระหว่าง [B และ TIMESTAMP]" ดูเหมือนว่า CURRENT_TIMESTAMP เป็นค่าไบนารีไม่ใช่วันที่และเวลา
Sindri Traustason

TIMESTAMP จะให้การป้อนข้อมูลดังนี้: yyyy-mm-dd 00:00:00 UTC; และนั่นสามารถทำให้ DB มีขนาดใหญ่มาก ฉันคิดว่าเขาหมายถึงเฉพาะวันที่ yyyy-mm-dd; และค่าเริ่มต้นสำหรับมันสามารถตั้งค่าได้โดยคลิกที่ "ตามที่กำหนดเป็น" ในมุมมองปกติของ phpmyadmin
Amine

@Amine, TIMESTAMP เป็นค่าไบนารีโดยทั่วไปแล้วจะใช้ 6-8 ไบต์ การแทนสตริงเป็นเพียงแค่การแสดงเช่นเดียวกับฐานข้อมูลที่ไม่ได้เก็บจำนวนเต็มเป็นสตริง (เว้นแต่คุณจะใส่เวลาลงในคอลัมน์ VARCHAR และวิบัติจะเป็นสิ่งที่พยายาม)
SilverbackNet

1
ฉันทราบว่าCURRENT_TIMESTAMPจะส่งคืนdatetimeค่าในเขตเวลาท้องถิ่นของคอมพิวเตอร์ ควรหลีกเลี่ยง ใช้SYSUTCDATETIMEสิ่งที่ส่งคืนเป็นdatetime2UTC แทน
Dai

28

ในขณะที่คำตอบที่ทำเครื่องหมายถูกต้องด้วย:

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 เป็นสถานที่ / วัฒนธรรมของผู้ใช้ที่ร้องขอ


19

ไม่อนุญาต 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"
stephmoreland

@steph - ดูแก้ไข คำตอบก่อนหน้าของฉันควรจะเป็นคอลัมน์ใหม่ คุณจะต้องไม่อนุญาตให้ NULL เป็นค่าเริ่มต้นในการทำงานดังนั้นคุณจะต้องการให้แถวที่มีอยู่ก่อนได้รับการปฏิบัติอย่างไร
Martin Smith

8

ไวยากรณ์สำหรับสิ่งนี้เมื่อสร้างตารางใหม่คือ:

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

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)

มันทำงานได้ดีเท่าเทียมกันในคำสั่ง ALTER TABLE เมื่อเพิ่มคอลัมน์ใหม่
Captain Sensible


4

สิ่งนี้ยังใช้งานได้:

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

หรือ:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE();

4

สิ่งนี้ใช้ได้สำหรับฉัน ฉันใช้ SQL Developer กับ Oracle DB:

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;

2

เพื่อให้ง่ายต่อการติดตามฉันจะสรุปคำตอบข้างต้น:

สมมติว่าตารางเรียกว่าลูกค้า มี 4 คอลัมน์ / น้อยกว่าหรือมากกว่า ...

คุณต้องการเพิ่มคอลัมน์ใหม่ลงในตารางที่ทุกครั้งเมื่อมีการแทรก ... จากนั้นคอลัมน์นั้นจะเก็บบันทึกเวลาที่เหตุการณ์เกิดขึ้น

สารละลาย:

เพิ่มคอลัมน์ใหม่ Let`s พูดtimepurchaseเป็นคอลัมน์ใหม่เพื่อตารางที่มีชนิดข้อมูลวันที่และเวลา

จากนั้นเรียกใช้การเปลี่ยนแปลงต่อไปนี้:

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

1

สมมติว่าคุณสร้างตารางฐานข้อมูลสำหรับระบบการลงทะเบียน

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()ใช้เวลาของเซิร์ฟเวอร์ในท้องถิ่นที่มี มิฉะนั้นคุณควรฟังคำพิพากษาของแทนเนอร์สำหรับผู้ชมทั่วโลกด้วยGETUTCDATE()ค่าเริ่มต้น

เพิ่มคอลัมน์ที่มีค่าเริ่มต้นในคำสั่งเดียวเช่นคำตอบนี้

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

0

ใน 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.