Aggiungere il valore predefinito del campo data / ora in SQL Server a un timestamp


280

Ho una tabella che raccoglie i moduli inviati dal nostro sito Web, ma per qualche motivo, quando hanno creato la tabella, non hanno inserito un timestamp nella tabella. Voglio che inserisca la data e l'ora esatte in cui è stato inserito il record.

So che è lì da qualche parte, ma non riesco a trovare come impostare il valore predefinito (come in Access, usi getNow()o Now()) ma non so dove metterlo.


Attenzione ai fusi orari: stackoverflow.com/a/31296917/57475
Tanner

Risposte:


352

Per modificare una colonna esistente in una tabella esistente:

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

2
@TheQ - Grazie. Capisco che cambio "YourTable" nel nome della mia tabella, ma la parte che non capisco è il vincolo. Cos'è un vincolo e dovrei modificare il tuo codice in modo che corrisponda al nome della mia tabella?
stephmoreland

La risposta di @steph - TheQpresume che tu stia alterando una colonna esistente che non credo sia il caso? Vedi la mia risposta per il codice per aggiungere una nuova colonna con questo vincolo predefinito.
Martin Smith

1
Affinché una colonna abbia un valore predefinito, è necessario un "vincolo predefinito" e questo comando lo aggiungerà. Puoi denominare il vincolo come preferisci, in genere Management Studio li denomina DF_TableName.
TheQ

@ TheQ - Perfetto, lo proverò. Avevi ragione, ho già il campo, ma volevo applicare la correzione, non crearne uno nuovo. Grazie per tutte le tue risposte!
stephmoreland

7
Se desideri il timestamp UTC invece dell'ora locale, puoi utilizzare al GETUTCDATE()posto diGETDATE()
Cocowalla,

159

Questo può essere fatto anche tramite la GUI di SSMS.

  1. Metti la tua tabella in visualizzazione struttura (fai clic con il pulsante destro del mouse sulla tabella in Esplora oggetti-> Progettazione )
  2. Aggiungi una colonna alla tabella (o fai clic sulla colonna che desideri aggiornare se esiste già)
  3. In Proprietà colonne, immettere (getdate())in Valore di default o di rilegatura campo come nella foto qui sotto

Immagine del tavolo in visualizzazione design


Buona domanda. Proverei dateadd(minute, 10, GetDate())a vedere se funziona.
Tony L.

Nella visualizzazione di progettazione del server sql l'ho provato, dice che il valore deve corrispondere a uno degli elementi nell'elenco! quindi l'ho fatto sul lato posteriore
shareef

Ho provato questo ma ottengo 0001-01-01T00:00:00invece della data corrente
Swaleh Matongwa

99

In quella tabella in SQL Server, specificare il valore predefinito di quella colonna da essere CURRENT_TIMESTAMP. Il tipo di dati di quella colonna può essere datetimeo datetime2.

per esempio

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

1
Ciò non riesce con il messaggio di errore "Impossibile convertire tra [B e TIMESTAMP]". Sembra che CURRENT_TIMESTAMP sia un valore binario, non un datetime.
Sindri Traustason

TIMESTAMP ti darà un input come questo: yyyy-mm-dd 00:00:00 UTC; e questo può rendere il DB così grande; penso che si riferisse solo alla data aaaa-mm-gg; e il valore predefinito può essere impostato facendo clic su "As Defined as" nella visualizzazione normale di phpmyadmin
Amine

@Amine, TIMESTAMP è un valore binario, che in genere utilizza 6-8 byte. La rappresentazione di stringa è proprio questo, una rappresentazione, proprio come il database non memorizza interi come stringhe. (A meno che tu non metta il tempo in una colonna VARCHAR, e guai a quelli che ci provano.)
SilverbackNet

1
Noto che CURRENT_TIMESTAMPrestituisce un datetimevalore nel fuso orario locale del computer. Dovrebbe essere evitato. Usa invece SYSUTCDATETIMEche restituisce un datetime2in UTC.
Dai

31

Mentre la risposta contrassegnata è corretta con:

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

È sempre necessario essere consapevoli dei fusi orari quando si aggiungono valori di data e ora predefiniti a una colonna.

Supponiamo, ad esempio, che questo datetimevalore sia progettato per indicare quando un membro si è unito a un sito Web e desideri che venga visualizzato di nuovo all'utente, GETDATE()ti darà l'ora del server, quindi potrebbe mostrare discrepanze se l'utente si trova in una lingua diversa dal server.

Se prevedi di trattare con utenti internazionali, in alcuni casi è meglio usare GETUTCDATE () , che:

Restituisce il timestamp del sistema del database corrente come valore datetime. L'offset del fuso orario del database non è incluso. Questo valore rappresenta l'ora UTC corrente (Coordinated Universal Time). Questo valore deriva dal sistema operativo del computer in cui è in esecuzione l'istanza di SQL Server.

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

Quando si recuperano i valori, l'applicazione / sito Web front-end deve trasformare questo valore dall'ora UTC alle impostazioni internazionali / cultura dell'utente che lo richiede.


19

Non consentire Null nella colonna e impostare un valore predefinito nella colonna di 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

Come lo modificheresti per cambiare il campo esistente "created_date"?
stephmoreland

@steph - Vedi Modifica. La mia risposta precedente supponeva che questa fosse una nuova colonna. Dovrai disabilitare i NULL affinché il valore predefinito funzioni, quindi come vuoi che vengano trattate le righe preesistenti?
Martin Smith

Esiste una DEFAULT GETDATE()garanzia che un multi-fila INSERTavrà lo stesso DATEper tutte le righe inserite, o potrebbe il GETDATEessere valutato per riga? E allo stesso modo per SYSDATETIME()?
John Rees

9

La sintassi per questo quando si crea una nuova tabella è:

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

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)

Funziona altrettanto bene in un'istruzione ALTER TABLE quando si aggiunge una nuova colonna.
Captain Sensible

7

Questo funziona per me ...

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

4

Funziona anche:

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

O:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE();

4

Questo ha funzionato per me. Sto usando SQL Developer con Oracle DB:

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;

2

Per renderlo più semplice da seguire, riassumerò le risposte di cui sopra:

Diciamo che la tabella si chiama Cliente e ha 4 colonne / meno o più ...

vuoi aggiungere una nuova colonna alla tabella dove ogni volta che c'è un inserimento ... allora quella colonna tiene un registro dell'ora in cui si è verificato l'evento.

Soluzione:

aggiungi una nuova colonna, diciamo che timepurchase è la nuova colonna, alla tabella con il tipo di dati datetime .

Quindi esegui la seguente modifica:

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

1

Supponiamo che tu crei una tabella di database per un sistema di registrazione.

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

Ora un paio di persone si registrano.

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

Allora ti rendi conto che hai bisogno di un timestamp per quando si sono registrati.

Se questa app è limitata a una regione geograficamente localizzata, puoi utilizzare l'ora del server locale con GETDATE(). Altrimenti dovresti prestare attenzione alla considerazione di Tanner per il pubblico globale con GETUTCDATE()il valore predefinito.

Aggiungi la colonna con un valore predefinito in un'istruzione come questa risposta .

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

Prendiamo un altro registrante e vediamo come sono i dati.

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

In SQLPlus durante la creazione di una tabella è come

SQL> crea tabella Test

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

SQL> inserisci in Test (id) valori (1);

 Test_ID Test_Date
       1 08-MAR-19
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.