Tambahkan nilai default bidang datetime di SQL Server ke stempel waktu


265

Saya punya tabel yang mengumpulkan formulir yang dikirimkan dari situs web kami, tetapi untuk beberapa alasan, ketika mereka membuat tabel, mereka tidak memasukkan stempel waktu di tabel. Saya ingin memasukkan tanggal dan waktu yang tepat ketika catatan dimasukkan.

Saya tahu ada di sana di suatu tempat, tapi sepertinya saya tidak bisa menemukan cara mengatur nilai default (seperti di Access, Anda menggunakan getNow()atau Now()) tetapi saya tidak tahu di mana harus meletakkannya.


Waspadalah terhadap zona waktu: stackoverflow.com/a/31296917/57475
Tanner

Jawaban:


332

Untuk memodifikasi kolom yang ada di tabel yang ada:

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

2
@TheQ - Terima kasih. Saya mendapatkan bahwa saya mengubah "YourTable" menjadi nama tabel saya, tetapi bagian yang saya tidak mengerti adalah Kendalanya. Apa itu kendala dan apakah saya akan memodifikasi kode Anda agar sesuai dengan nama tabel saya?
stephmoreland

@steph - TheQ's mengasumsikan Anda mengubah kolom yang ada yang saya tidak yakin menjadi masalahnya? Lihat jawaban saya untuk kode untuk menambahkan kolom baru dengan batasan default ini.
Martin Smith

1
Agar kolom memiliki nilai default, diperlukan "batasan default", dan perintah ini akan menambahkannya. Anda dapat memberi nama batasan apa pun yang Anda suka, Management Studio biasanya menamainya DF_TableName.
TheQ

@TheQ - Itu sempurna, saya akan mencobanya. Anda benar, saya sudah memiliki bidang, tetapi saya ingin menerapkan perbaikan untuk itu, bukan membuat yang baru. Terima kasih atas semua jawaban Anda!
stephmoreland

6
Jika Anda menginginkan stempel waktu UTC alih-alih waktu setempat, Anda dapat menggunakan GETUTCDATE()sebagai gantiGETDATE()
Cocowalla

147

Ini juga bisa dilakukan melalui GUI SSMS.

  1. Letakkan meja Anda di tampilan desain (Klik kanan pada tabel di objek explorer-> Desain )
  2. Tambahkan kolom ke tabel (atau klik pada kolom yang ingin Anda perbarui jika sudah ada)
  3. Di Properti Kolom, masukkan (getdate())dalam Nilai Default atau bidang Binding seperti yang digambarkan di bawah ini

Gambar tabel dalam tampilan desain


Pertanyaan bagus. Saya akan mencoba dateadd(minute, 10, GetDate())melihat apakah itu berhasil.
Tony L.

Dalam tampilan desain sql server saya mencobanya, dikatakan nilainya harus cocok dengan salah satu item dalam daftar! jadi saya membuatnya di sisi belakang
shareef

92

Dalam tabel itu di SQL Server, tentukan nilai default kolom yang akan CURRENT_TIMESTAMP. Tipe data dari kolom itu mungkin datetime atau datetime2.

misalnya

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

1
Ini gagal dengan pesan kesalahan "Tidak dapat mengonversi antara [B dan TIMESTAMP]". Tampaknya CURRENT_TIMESTAMP adalah nilai biner, bukan datetime.
Sindri Traustason

TIMESTAMP akan memberi Anda input seperti ini: yyyy-mm-dd 00:00:00 UTC; dan itu bisa membuat DB menjadi sangat besar; saya pikir maksudnya hanya tanggal yyyy-mm-dd; dan nilai default untuk itu dapat ditetapkan dengan mengklik "As Defined as" dalam tampilan normal phpmyadmin
Amine

@Amine, TIMESTAMP adalah nilai biner, biasanya menggunakan 6-8 byte. Representasi string hanya itu, representasi, seperti database tidak menyimpan bilangan bulat sebagai string. (Kecuali jika Anda memasukkan waktu ke kolom VARCHAR, dan celakalah yang mencoba.)
SilverbackNet

1
Saya perhatikan bahwa CURRENT_TIMESTAMPmengembalikan datetimenilai di zona waktu lokal komputer. Itu harus dihindari. Alih-alih gunakan SYSUTCDATETIMEyang mengembalikan a datetime2dalam UTC.
Dai

28

Sementara jawaban yang ditandai sudah benar dengan:

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

Anda harus selalu mengetahui zona waktu saat menambahkan nilai datetime default ke dalam kolom.

Katakan misalnya, datetimenilai ini dirancang untuk menunjukkan ketika seorang anggota bergabung dengan sebuah situs web dan Anda ingin itu ditampilkan kembali kepada pengguna, GETDATE()akan memberi Anda waktu server sehingga dapat menunjukkan perbedaan jika pengguna berada di tempat yang berbeda dengan server.

Jika Anda berharap untuk berurusan dengan pengguna internasional, dalam beberapa kasus lebih baik menggunakan GETUTCDATE () , yang:

Mengembalikan timestamp sistem database saat ini sebagai nilai waktu dat. Offset zona waktu basis data tidak termasuk. Nilai ini mewakili waktu UTC saat ini (Waktu Universal Terkoordinasi). Nilai ini berasal dari sistem operasi komputer tempat instance SQL Server berjalan.

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

Saat mengambil nilai, aplikasi / situs web ujung depan harus mengubah nilai ini dari waktu UTC ke lokal / budaya pengguna yang memintanya.


19

Larang Null pada kolom dan tetapkan default pada kolom 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

Bagaimana Anda mengubahnya untuk mengubah bidang yang ada "Created_date"?
stephmoreland

@steph - Lihat Edit. Jawaban saya sebelumnya mengira ini adalah kolom baru. Anda harus melarang NULL agar default berfungsi, jadi bagaimana Anda ingin baris yang sudah ada diperlakukan?
Martin Smith

8

Sintaks untuk ini ketika membuat tabel baru adalah:

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

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)

Ini berfungsi sama baiknya dalam pernyataan ALTER TABLE saat menambahkan kolom baru.
Kapten Sensible

7

Ini bekerja untuk saya ...

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

4

Ini juga berfungsi:

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

Atau:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE();

4

Ini berhasil untuk saya. Saya menggunakan Pengembang SQL dengan Oracle DB:

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;

2

Agar lebih mudah diikuti, saya akan merangkum jawaban di atas:

Katakanlah tabel ini disebut Pelanggan memiliki 4 kolom / kurang atau lebih ...

Anda ingin menambahkan kolom baru ke tabel di mana setiap kali ketika ada masukkan ... maka kolom itu mencatat kapan peristiwa itu terjadi.

Larutan:

tambahkan kolom baru, katakanlah timepurchase adalah kolom baru, ke tabel dengan tipe data datetime .

Kemudian jalankan perubahan berikut:

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

1

Katakanlah Anda membuat tabel database untuk sistem pendaftaran.

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

Sekarang beberapa orang mendaftar.

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

Maka Anda sadar bahwa Anda memerlukan cap waktu untuk saat mereka mendaftar.

Jika aplikasi ini terbatas pada wilayah yang dilokalkan secara geografis, maka Anda dapat menggunakan waktu server lokal bersama GETDATE(). Kalau tidak, Anda harus memperhatikan pertimbangan Tanner untuk audiens globalGETUTCDATE() nilai default.

Tambahkan kolom dengan nilai default dalam satu pernyataan seperti jawaban ini .

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

Mari cari pendaftar lain dan lihat seperti apa data itu.

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

Dalam SQLPlus saat membuat tabel itu seperti

SQL> buat Uji tabel

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

SQL> masukkan ke nilai Test (id) (1);

 Test_ID Test_Date
       1 08-MAR-19
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.