2011-02-03 10 views
151

Mam tabelę, która zbiera formularze przesłane z naszej strony internetowej, ale z jakiegoś powodu, kiedy utworzyli tabelę, nie wstawili znacznika czasu do tabeli . Chcę, aby wprowadził dokładną datę i godzinę wpisu.Dodaj domyślną wartość pola datetime w SQL Server do znacznika czasu.

Wiem, że gdzieś tam jest, ale nie mogę znaleźć sposobu na ustawienie wartości domyślnej (jak w Access, używasz getNow() lub Now()), ale nie wiem, gdzie to umieścić.

Odpowiedz

214

Na modyfikację istniejącej kolumny w istniejącej tabeli:

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

@Q - Dzięki. Rozumiem, że zmienię "Twoja tabela" na nazwę mojego stołu, ale część, której nie rozumiem, to Więź. Co to jest ograniczenie i czy mogę zmodyfikować kod, aby pasował do nazwy mojego stołu? – stephmoreland

+0

@steph - "Odpowiedź TheQ zakłada, że ​​zmieniasz istniejącą kolumnę, której nie uważam za prawidłową? Zobacz moją odpowiedź na kod, aby dodać nową kolumnę z tym domyślnym ograniczeniem. –

+1

Aby kolumna miała wartość domyślną, musi mieć "domyślne ograniczenie", a to polecenie doda to. Możesz nazwać ograniczenie, jakie chcesz, Studio Zarządzania zwykle nazywa je DF_TableName. – TheQ

15

zezwalaj na wartości null na kolumnie i ustawić domyślną na kolumnie 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

Jak byś się zmieniać, że aby zmienić pole istniejący "CREATED_DATE"? – stephmoreland

+0

@steph - Zobacz Edycja. Moja poprzednia odpowiedź zakładała, że ​​jest to nowa kolumna. Będziesz musiał wyłączyć NULL, aby domyślny działał, więc w jaki sposób chcesz traktować istniejące wcześniej wiersze? –

62

w tej tabeli w SQL Server, określ domyślną wartość tej kolumnie będzie CURRENT_TIMESTAMP. DataType tej kolumny może być datetime lub datetime2.

np.

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

Mam nadzieję, że zadziała.

+1

Nie powiedzie się to z komunikatem o błędzie "Nie można dokonać konwersji między [B i TIMESTAMP]". Wygląda na to, że CURRENT_TIMESTAMP jest wartością binarną, a nie datetime. –

+0

TIMESTAMP da ci dane wejściowe: yyyy-mm-dd 00:00:00 UTC; a to może sprawić, że DB będzie tak duży; Myślę, że miał na myśli tylko datę rrrr-mm-dd; a wartość domyślną można ustawić, klikając "Tak jak zdefiniowano" w widoku normalnym phpmyadmin – Amine

5

Składnia to podczas tworzenia nowej tabeli jest:

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

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

Działa równie dobrze w instrukcji ALTER TABLE podczas dodawania nowej kolumny. –

2

Aby uprościć do naśladowania, będę Podsumuj powyższe odpowiedzi:

Załóżmy, że stół nazywa się Cutomer ma 4 kolumny/mniej lub więcej ...

Chcesz dodać nową kolumnę do tabeli, w której za każdym razem, gdy jest wstawka ..., ta kolumna rejestruje czas zdarzenia.

Rozwiązanie:

dodać nową kolumnę, Let`s powiedzieć timePurchase jest nowa kolumna, do stołu z typem danych datetime.

Następnie uruchom następujące alter:

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

Można to również zrobić za pośrednictwem SSMS GUI.

  1. umieścić tabelę w widoku projektu (prawy przycisk myszy na stole w obiekcie explorer->projekt)
  2. dodać kolumnę do tabeli (lub kliknij na nagłówek kolumny, którą chcesz zaktualizować, jeśli już istnieje)
  3. w właściwości kolumn, wprowadź (getdate()) w Wartość domyślna lub Binding polu jak na zdjęciu poniżej

enter image description here

+1

Za każdym razem, gdy tu wracam, po prostu sprawdzam, jak to robię w GUI. Dziękuję Tony. – Daidon

11

Choć marked answer jest poprawny z:

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

Zawsze należy mieć świadomość stref czasowych podczas dodawania wartości domyślne datetime do kolumny.

Załóżmy na przykład, że ta wartość datetime została zaprojektowana w celu wskazania, kiedy członek dołączył do witryny i chcesz, aby był wyświetlany użytkownikowi, GETDATE() da ci czas serwera, więc może pokazać rozbieżności, jeśli użytkownik jest w różne ustawienia regionalne na serwerze.

planujący czynienia z międzynarodowych użytkowników, to lepiej w niektórych przypadkach użycie GETUTCDATE(), który:

zwraca aktualny timestamp systemu baz danych jako wartość datetime. Przesunięcie strefy czasowej bazy danych nie jest uwzględniane. Ta wartość reprezentuje aktualny czas UTC (Coordinated Universal Time). Ta wartość pochodzi z systemu operacyjnego komputera, na którym działa instancja SQL Server.

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

Podczas pobierania wartości, front end aplikacja/strona powinna przekształcić tę wartość od czasu UTC do locale/kulturze użytkownika wzywającego go.

2

Działa to również:

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

czyli

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

Powiedzmy utworzyć tabelę bazy danych do systemu rejestracji.

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

Teraz kilka osób rejestruje się.

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

Następnie zdajesz sobie sprawę, że potrzebujesz czas na rejestrację.

Jeśli ta aplikacja jest ograniczona do geograficznie zlokalizowanego regionu, wówczas może użyć czasu lokalnego serwera z GETDATE(). W przeciwnym razie powinieneś posłuchać Tanner's consideration dla globalnej publiczności z GETUTCDATE() dla domyślnej wartości.

Dodaj kolumnę z wartością domyślną w jednym zestawieniu, takim jak this answer.

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

Weźmy innego rejestrującego i zobaczmy, jak dane wyglądają.

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

Działa to dla mnie ...

ALTER TABLE `accounts` ADD `user_registered` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ; 
Powiązane problemy