Dodaj domyślną wartość pola datetime w SQL Server do znacznika czasu

265

Mam tabelę, która zbiera formularze przesłane z naszej strony internetowej, ale z jakiegoś powodu, kiedy utworzyli tabelę, nie umieścili w niej znacznika czasu. Chcę, aby podała dokładną datę i godzinę, kiedy rekord został wprowadzony.

Wiem, że gdzieś tam jest, ale nie mogę znaleźć sposobu, aby ustawić wartość domyślną (np. W programie Access, używasz getNow()lub Now()), ale nie wiem, gdzie ją umieścić.

Stephmoreland
źródło
Uważaj na strefy czasowe: stackoverflow.com/a/31296917/57475
Tanner

Odpowiedzi:

332

Aby zmodyfikować istniejącą kolumnę w istniejącej tabeli:

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn
Q
źródło
2
@TheQ - Dzięki. Rozumiem, że zmieniam „YourTable” na nazwę mojej tabeli, ale część, której nie rozumiem, to Ograniczenie. Co to jest ograniczenie i czy zmodyfikowałbym Twój kod, aby pasował do nazwy mojej tabeli?
stephmoreland
Odpowiedź @steph - TheQzakłada, że ​​zmieniasz istniejącą kolumnę, co nie wydaje mi się, że tak jest? Zobacz moją odpowiedź na kod, aby dodać nową kolumnę z tym domyślnym ograniczeniem.
Martin Smith
1
Aby kolumna miała wartość domyślną, potrzebuje „domyślnego ograniczenia”, a to polecenie ją doda. Możesz nazwać ograniczenie, jak chcesz, Management Studio zwykle nazywa je DF_TableName.
TheQ
@TheQ - Idealnie, spróbuję. Miałeś rację, mam już pole, ale chciałem zastosować do niego poprawkę, a nie utworzyć nową. Dzięki za wszystkie odpowiedzi!
stephmoreland
6
Jeśli chcesz mieć czas UTC zamiast czasu lokalnego, możesz użyć GETUTCDATE()zamiastGETDATE()
Cocowalla,
147

Można to również zrobić za pomocą graficznego interfejsu użytkownika SSMS.

  1. Umieść tabelę w widoku projektu (kliknij prawym przyciskiem myszy tabelę w eksploratorze obiektów-> Projekt )
  2. Dodaj kolumnę do tabeli (lub kliknij kolumnę, którą chcesz zaktualizować, jeśli już istnieje)
  3. We właściwościach kolumny wprowadź (getdate())w polu Wartość domyślna lub Powiązanie, jak pokazano poniżej

Obraz stołu w widoku projektu

Tony L.
źródło
Dobre pytanie. Spróbuję dateadd(minute, 10, GetDate())sprawdzić, czy to zadziała.
Tony L.
W widoku projektu serwera sql próbowałem, to znaczy, że wartość musi pasować do jednego z elementów na liście! więc zrobiłem to z tyłu
shareef
92

W tej tabeli w programie SQL Server określ domyślną wartość tej kolumny CURRENT_TIMESTAMP. Typ danych tej kolumny może być datetime lub datetime2.

na przykład

Create Table Student
(
  Name varchar(50),
  DateOfAddmission datetime default CURRENT_TIMESTAMP
);
Sanjay
źródło
1
Nie udaje się to z komunikatem o błędzie „Nie można przekonwertować między [B i TIMESTAMP]”. Wygląda na to, że CURRENT_TIMESTAMP jest wartością binarną, a nie datetime.
Sindri Traustason
TIMESTAMP da ci takie dane wejściowe: rrrr-mm-dd 00:00:00 UTC; i to może sprawić, że DB będzie tak duży; myślę, że miał na myśli jedynie datę rrrr-mm-dd; a wartość domyślną można ustawić, klikając „As Defined as” w normalnym widoku phpmyadmin
Amine
@ Amine, TIMESTAMP jest wartością binarną, zwykle używającą 6-8 bajtów. Reprezentacja ciągu jest po prostu reprezentacją, podobnie jak baza danych nie przechowuje liczb całkowitych jako ciągów. (Chyba, że ​​umieścisz czas w kolumnie VARCHAR, a biada tym, którzy próbują.)
SilverbackNet
1
Zwracam uwagę, że CURRENT_TIMESTAMPzwraca datetimewartość w lokalnej strefie czasowej komputera. Należy tego unikać. Zamiast tego użyj, SYSUTCDATETIMEktóra zwraca a datetime2w UTC.
Dai
28

Podczas gdy zaznaczona odpowiedź jest poprawna z:

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

Podczas dodawania domyślnych wartości daty i godziny do kolumny należy zawsze pamiętać o strefach czasowych.

Powiedzmy na przykład, że ta datetimewartość ma na celu wskazanie, kiedy członek dołączył do strony internetowej i chcesz, aby była ona wyświetlana użytkownikowi,GETDATE() da ci czas na serwerze, więc może pokazać rozbieżności, jeśli użytkownik znajduje się w innej lokalizacji niż serwer.

Jeśli spodziewasz się, że będziesz kontaktować się z międzynarodowymi użytkownikami, w niektórych przypadkach lepiej jest użyć GETUTCDATE () , który:

Zwraca bieżący znacznik czasu systemu bazy danych jako wartość daty i godziny. Przesunięcie strefy czasowej bazy danych nie jest uwzględnione. Ta wartość reprezentuje aktualny czas UTC (skoordynowany czas uniwersalny). Ta wartość pochodzi od systemu operacyjnego komputera, na którym działa wystąpienie programu SQL Server.

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

Podczas pobierania wartości aplikacja / witryna frontonu powinna przekształcić tę wartość z czasu UTC do ustawień regionalnych / kultury użytkownika, który o nią prosi.

Garbarz
źródło
19

Nie zezwalaj na wartości Null w kolumnie i ustaw wartość domyślną w kolumnie 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
Martin Smith
źródło
Jak byś to zmienił, aby zmienić istniejące pole „Created_date”?
stephmoreland
@steph - Zobacz Edycja. Moja poprzednia odpowiedź zakładała, że ​​była to nowa kolumna. Musisz wyłączyć NULL, aby domyślny działał, więc jak chcesz traktować istniejące wcześniej wiersze?
Martin Smith
8

Składnia tego podczas tworzenia nowej tabeli jest następująca:

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

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)
David Sopko
źródło
Działa równie dobrze w instrukcji ALTER TABLE podczas dodawania nowej kolumny.
Captain Sensible
7

To działa dla mnie ...

ALTER TABLE [accounts] 
 ADD [user_registered] DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;
dsixnine
źródło
4

Działa to również:

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

Lub:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE();
Keoma Borges
źródło
4

To zadziałało dla mnie. Korzystam z SQL Developer z Oracle DB:

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;
JavaGeek
źródło
2

Aby ułatwić śledzenie, podsumuję powyższe odpowiedzi:

Powiedzmy, że tabela nazywa się Klient ma 4 kolumny / mniej lub więcej ...

chcesz dodać nową kolumnę do tabeli, w której za każdym razem, gdy jest wstawiana ... wtedy ta kolumna prowadzi rejestr czasu zdarzenia.

Rozwiązanie:

dodaj nową kolumnę, powiedzmy, że timepurchase to nowa kolumna w tabeli z typem danych datetime .

Następnie uruchom następującą zmianę:

ALTER TABLE Customer ADD CONSTRAINT DF_Customer DEFAULT GETDATE() FOR timePurchase
niesamolubny
źródło
1

Załóżmy, że tworzysz tabelę bazy danych dla 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 rejestruje się kilka osób.

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

Wtedy zdajesz sobie sprawę, że potrzebujesz sygnatury czasowej, kiedy się zarejestrują.

Jeśli ta aplikacja jest ograniczona do regionu zlokalizowanego geograficznie, możesz użyć czasu lokalnego serwera z GETDATE(). W przeciwnym razie należy wziąć pod uwagę uwagę Tannera dla globalnej publicznościGETUTCDATE() wartością domyślną.

Dodaj kolumnę z wartością domyślną do jednej instrukcji takiej jak ta odpowiedź .

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

Zdobądźmy kolejnego rejestrującego i zobaczmy, jak wyglądają dane.

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
Jeff Puckett
źródło
0

W SQLPlus podczas tworzenia tabeli jest tak jak

SQL> utwórz test tabeli

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

SQL> wstaw do wartości Test (id) (1);

 Test_ID Test_Date
       1 08-MAR-19
Osama Zafar
źródło