2011-02-03 87 views
151

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.Aggiungere il valore predefinito del campo data/ora in SQL Server a un timestamp

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

risposta

214

Per modificare una colonna esistente in una tabella esistente:

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

@TheQ - Grazie. Capisco che cambio "YourTable" al mio nome di tabella, ma la parte che non capisco è il vincolo. Cos'è un vincolo e dovrei modificare il codice in modo che corrisponda al nome del mio tavolo? – stephmoreland

+0

@steph - La risposta di 'TheQ' presuppone che stai modificando una colonna esistente che non credo sia il caso? Vedere la mia risposta per il codice per aggiungere una nuova colonna con questo vincolo predefinito. –

+1

Affinché una colonna abbia un valore predefinito, ha bisogno di un "vincolo predefinito", e questo comando lo aggiungerà. Puoi nominare il vincolo come preferisci, in genere in Management Studio i nomi DF_TableName. – TheQ

15

Disallow Null della colonna e impostare un valore predefinito per la colonna di 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

Come ti alterare che per cambiare il campo esistente "CREATED_DATE"? – stephmoreland

+0

@steph - Vedi Modifica. La mia risposta precedente supponeva che questa fosse una nuova colonna. Sarà necessario disabilitare i valori NULL perché il valore predefinito funzioni, quindi come si desidera che le righe preesistenti vengano trattate? –

62

In tale tabella in SQL Server, specificare il valore di default di quella colonna di essere CURRENT_TIMESTAMP. DataType di tale colonna può essere datetime o datetime2.

ad es.

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

Spero che funzionerà.

+1

Errore con il messaggio di errore "Impossibile convertire tra [B e TIMESTAMP]". Sembra che CURRENT_TIMESTAMP sia un valore binario, non un datetime. –

+0

TIMESTAMP ti fornirà un input come questo: aaaa-mm-gg 00:00:00 UTC; e questo può rendere il DB così grande; penso che intendesse solo la data yyyy-mm-dd; e il valore predefinito per esso può essere impostato facendo clic su "Come definito come" nella visualizzazione normale di phpmyadmin – Amine

5

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() 
) 
+0

Funziona ugualmente bene in un'istruzione ALTER TABLE quando si aggiunge una nuova colonna. –

2

per rendere più semplice da seguire, lo farò summarize le risposte di cui sopra:

Diciamo che il tavolo si chiama Cutomer ha 4 colonne/meno o più ...

si desidera aggiungere una nuova colonna alla tabella in cui ogni volta che è inserito ... quindi quella colonna registra il tempo in cui si è verificato l'evento.

Soluzione:

aggiungere nuova colonna, Let `s dicono timePurchase è la nuova colonna, al tavolo con tipo di dati datetime .

quindi eseguire il seguente alter:

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

Questo può essere fatto anche attraverso lo SSMS GUI.

  1. Metti la tua tabella in visualizzazione struttura (clic destro sulla tabella in oggetto Explorer->design)
  2. aggiungere una colonna alla tabella (o fare clic sulla colonna che si desidera aggiornare se esiste già)
  3. in Proprietà colonne, immettere (getdate()) in Valore predefinito o Binding campo come nella foto sotto

enter image description here

+1

Ogni volta che torno qui solo per verificare come lo faccio nella GUI. Grazie Tony. – Daidon

11

Mentre il marked answer è corretto con:

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

Si dovrebbe sempre essere a conoscenza di fusi orari quando si aggiungono i valori di default datetime in a una colonna.

diciamo per esempio, questo valore datetime è progettato per indicare quando un membro si è unito un sito web e si vuole che sia visualizzato indietro per l'utente, GETDATE() vi darà il tempo di server in modo potrebbe mostrare le discrepanze se l'utente è in una impostazioni internazionali differenti al server.

Se si prevede di trattare con gli utenti internazionali, è meglio in alcuni casi, di utilizzare GETUTCDATE(), che:

Restituisce l'attuale timestamp sistema di database 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 su cui è in esecuzione l'istanza di SQL Server.

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

Quando si recuperano i valori, il fronte delle applicazioni end/sito web dovrebbe trasformare questo valore da ora UTC alle impostazioni internazionali/cultura dell'utente lo richiedono.

2

Questo funziona anche:

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

Oppure:

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

Diciamo che si crea 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'); 

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

Se questa applicazione è limitata a un'area geograficamente localizzata, allora è possibile utilizzare l'ora del server locale con GETDATE(). Altrimenti dovresti prendere in considerazione il numero Tanner's consideration per il pubblico globale con GETUTCDATE() per il valore predefinito.

Aggiungere la colonna con un valore predefinito in un'istruzione come this answer.

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

Otteniamo 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 
2

Questo funziona per me ...

ALTER TABLE `accounts` ADD `user_registered` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ; 
Problemi correlati