Zaman damgasına SQL Server'daki datetime alanının varsayılan değerini ekleme


265

Web sitemizden gönderilen formları toplayan bir masam var, ancak bazı nedenlerden dolayı, tabloyu oluşturduklarında, tabloya bir zaman damgası koymadılar. Kaydın girildiği tarih ve saati tam olarak girmesini istiyorum.

Orada bir yerde olduğunu biliyorum, ancak varsayılan değeri (Access gibi, kullanın getNow()veya Now()) nasıl ayarlayacağımı bulamıyorum ama nereye koyacağımı bilmiyorum.


Zaman dilimlerine dikkat edin: stackoverflow.com/a/31296917/57475
Tanner

Yanıtlar:


332

Mevcut bir tablodaki mevcut bir sütunu değiştirmek için:

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

2
@TheQ - Teşekkürler. "YourTable" ı tablo adımla değiştirdiğimi anlıyorum, ama anlamadığım kısım Kısıtlama. Kısıtlama nedir ve kodunuzu masamın adıyla eşleşecek şekilde değiştirir miyim?
stephmoreland

@steph - TheQyanıtı, durum olduğuna inandığım mevcut bir sütunu değiştirdiğinizi varsayar? Bu varsayılan kısıtlamayla yeni bir sütun eklemek için kodumun cevabına bakın.
Martin Smith

1
Bir sütunun varsayılan bir değere sahip olması için bir "varsayılan kısıtlamaya" ihtiyacı vardır ve bu komut bunu ekler. Kısıtlamayı istediğiniz gibi adlandırabilirsiniz, Management Studio genellikle bunları DF_TableName olarak adlandırır.
TheQ

@TheQ - Mükemmel, deneyeceğim. Haklıydın, zaten alanım var, ama düzeltmeyi yeni bir tane oluşturmak yerine uygulamak istedim. Tüm cevaplarınız için teşekkürler!
stephmoreland

6
Yerel saat yerine UTC zaman damgası istiyorsanızGETUTCDATE()GETDATE()
Cocowalla

147

Bu, SSMS GUI aracılığıyla da yapılabilir.

  1. Tablonuzu tasarım görünümüne yerleştirin (Nesne gezgininde tabloya sağ tıklayın-> Tasarım )
  2. Tabloya bir sütun ekleyin (veya zaten varsa güncellemek istediğiniz sütunu tıklayın)
  3. Sütun özellikleri, girmek (getdate())içinde Varsayılan Değer veya Cilt aşağıdaki resimde gösterilen alana

Tablo tasarım görünümünde görüntü


İyi soru. Bunun dateadd(minute, 10, GetDate())işe yarayıp yaramadığını görmek isterdim .
Tony L.

Sql sunucu tasarım görünümünde denedim, değer listedeki öğelerden biriyle eşleşmesi gerektiğini söylüyor! bu yüzden arka tarafta yaptım
shareef

92

SQL Server'daki bu tabloda, o sütunun varsayılan değerini belirtin CURRENT_TIMESTAMP. Bu sütunun veri türü datetime veya datetime2 olabilir.

Örneğin

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

1
"[B ve TIMESTAMP] arasında dönüştürme yapılamıyor" hata iletisiyle başarısız oluyor. Görünüşe göre CURRENT_TIMESTAMP tarih-saat değil, ikili bir değerdir.
Sindri Traustason

TIMESTAMP size şöyle bir girdi verecektir: yyyy-aa-gg 00:00:00 UTC; ve bu DB'nin çok büyük olmasını sağlayabilir; bence sadece tarih yyyy-aa-gg demekti; ve bunun için varsayılan değer, phpmyadmin'in normal görünümünde "As Defined as" ı tıklatarak ayarlanabilir
Amine

@Amine, TIMESTAMP, tipik olarak 6-8 bayt kullanan bir ikili değerdir. Dize gösterimi, tıpkı veritabanı tamsayıları dize olarak depolamaması gibi bir gösterimdir. (Süreyi bir VARCHAR sütununa koymadığınız ve denemek isteyenler olmaz.)
SilverbackNet

1
Bilgisayarın yerel saat diliminde CURRENT_TIMESTAMPbir datetimedeğer döndürdüğünü unutmayın . Kaçınılmalıdır. Bunun yerine UTC'de SYSUTCDATETIMEa döndüren kullanın datetime2.
Dai

28

İken işaretli yanıt ile doğrudur:

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

Bir sütuna varsayılan datetime değerleri eklerken daima zaman dilimlerinin farkında olmalısınız.

Örneğin, bu datetimedeğer, bir üyenin bir web sitesine ne zaman katıldığını ve kullanıcıya tekrar gösterilmesini istediğinizi belirtmek üzere tasarlanmıştır, GETDATE()böylece sunucuya farklı bir yerel konumdaysa, kullanıcının sunucuya zaman vermesini sağlayabilirsiniz.

Uluslararası kullanıcılarla uğraşmayı düşünüyorsanız, bazı durumlarda GETUTCDATE () kullanmak daha iyidir :

Geçerli veritabanı sistemi zaman damgasını datetime değeri olarak döndürür. Veritabanı saat dilimi uzaklığı dahil değildir. Bu değer geçerli UTC saatini (Eşgüdümlü Evrensel Saat) temsil eder. Bu değer, SQL Server örneğinin çalıştığı bilgisayarın işletim sisteminden türetilir.

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

Değerleri alırken, kullanıcı arabirimi uygulaması / web sitesi bu değeri UTC zamanından talep eden kullanıcının yerel ayarına / kültürüne dönüştürmelidir.


19

Sütunda Boş Değerlere İzin Verme ve sütununda bir varsayılan değer ayarlama 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

Mevcut "created_date" alanını değiştirmek için bunu nasıl değiştirirsiniz?
stephmoreland

@steph - Bkz. Düzenle. Önceki cevabım bunun yeni bir sütun olduğunu varsayıyordu. Varsayılanın çalışması için NULL'lara izin vermemeniz gerekir, böylece önceden var olan satırların nasıl ele alınmasını istersiniz?
Martin Smith

8

Yeni bir tablo oluştururken bunun söz dizimi:

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

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)

Yeni bir sütun eklerken bir ALTER TABLE deyiminde eşit derecede iyi çalışır.
Kaptan Duyarlı

7

Bu benim için çalışıyor ...

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

4

Bu da işe yarar:

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

Veya:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE();

4

Bu benim için çalıştı. Oracle DB ile SQL Developer kullanıyorum:

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;

2

Takip etmeyi kolaylaştırmak için yukarıdaki cevapları özetleyeceğim :

Diyelim ki tablonun Müşteri deniyor, 4 sütun / daha az veya daha fazla var ...

her ekleme olduğunda tabloya yeni bir sütun eklemek istersiniz ... o zaman bu sütun olayın gerçekleştiği zamanın kaydını tutar.

Çözüm:

yeni bir sütun ekleyin, diyelim ki timepurchase yeni sütuntur , datetime veri türü içeren tabloya .

Sonra aşağıdaki değişikliği çalıştırın:

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

1

Bir kayıt sistemi için bir veritabanı tablosu oluşturduğunuzu varsayalım.

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

Şimdi birkaç kişi kayıt oluyor.

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

Ardından, kayıt olduklarında zaman damgasına ihtiyacınız olduğunu fark edersiniz.

Bu uygulamanın bir coğrafi lokalize bir bölge olup, o zaman yapabilirsiniz ile yerel sunucu zamanı kullanın GETDATE(). Aksi takdirde, Tanner'ın küresel kitleye yönelik düşüncesiniGETUTCDATE() varsayılan değerle dikkate almalısınız .

Bu yanıta benzer bir ifadeye varsayılan değeri olan sütunu ekleyin .

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

Şimdi başka bir tescil ettiren ve verilerin neye benzediğini görelim.

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'ta bir tablo oluştururken,

SQL> tablo testi oluştur

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

SQL> Test (id) değerlerine ekle (1);

 Test_ID Test_Date
       1 08-MAR-19
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.