Ajouter la valeur par défaut du champ datetime dans SQL Server à un horodatage

265

J'ai un tableau qui recueille les formulaires soumis à partir de notre site Web, mais pour une raison quelconque, lorsqu'ils ont créé le tableau, ils n'ont pas mis d'horodatage dans le tableau. Je souhaite qu'il saisisse la date et l'heure exactes de l'enregistrement.

Je sais que c'est quelque part, mais je n'arrive pas à trouver comment définir la valeur par défaut (comme dans Access, vous utilisez getNow()ou Now()), mais je ne sais pas où le mettre.

stephmoreland
la source
Méfiez-vous des fuseaux horaires: stackoverflow.com/a/31296917/57475
Tanner

Réponses:

332

Pour modifier une colonne existante dans une table existante:

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn
Le Q
la source
2
@TheQ - Merci. J'obtiens que je change "YourTable" en mon nom de table, mais la partie que je ne comprends pas est la contrainte. Qu'est-ce qu'une contrainte et est-ce que je modifierais votre code pour qu'il corresponde au nom de ma table?
stephmoreland
La réponse de @steph - TheQsuppose que vous modifiez une colonne existante que je ne pense pas être le cas? Voir ma réponse pour le code pour ajouter une nouvelle colonne avec cette contrainte par défaut.
Martin Smith
1
Pour qu'une colonne ait une valeur par défaut, elle a besoin d'une "contrainte par défaut", et cette commande l'ajoutera. Vous pouvez nommer la contrainte comme vous le souhaitez, Management Studio les nomme généralement DF_TableName.
TheQ
@TheQ - C'est parfait, je vais l'essayer. Vous aviez raison, j'ai déjà le champ, mais je voulais lui appliquer le correctif, pas en créer un nouveau. Merci pour toutes vos réponses!
stephmoreland
6
Si vous voulez l'horodatage UTC au lieu de l'heure locale, vous pouvez utiliser GETUTCDATE()au lieu deGETDATE()
Cocowalla
147

Cela peut également être fait via l'interface graphique SSMS.

  1. Mettez votre table en mode création (clic droit sur la table dans l'explorateur d'objets-> Conception )
  2. Ajoutez une colonne au tableau (ou cliquez sur la colonne que vous souhaitez mettre à jour si elle existe déjà)
  3. Dans Propriétés de la colonne, entrez (getdate())dans le champ Valeur par défaut ou Liaison comme illustré ci-dessous

Image de la table en mode Création

Tony L.
la source
Bonne question. J'essaierais dateadd(minute, 10, GetDate())de voir si cela fonctionne.
Tony L.
Dans la vue de conception du serveur SQL, je l'ai essayé, il dit que la valeur doit correspondre à l'un des éléments de la liste! donc je l'ai fait sur le côté arrière
shareef
92

Dans ce tableau dans SQL Server, spécifiez la valeur par défaut de cette colonne CURRENT_TIMESTAMP. Le type de données de cette colonne peut être datetime ou datetime2.

par exemple

Create Table Student
(
  Name varchar(50),
  DateOfAddmission datetime default CURRENT_TIMESTAMP
);
Sanjay
la source
1
Cela échoue avec le message d'erreur "Impossible de convertir entre [B et TIMESTAMP]". Il semble que CURRENT_TIMESTAMP soit une valeur binaire, pas une date / heure.
Sindri Traustason
TIMESTAMP vous donnera une entrée comme celle-ci: aaaa-mm-jj 00:00:00 UTC; et cela peut rendre la DB si grande; je pense qu'il ne voulait dire que la date aaaa-mm-jj; et la valeur par défaut pour cela peut être définie en cliquant sur "As Defined as" dans la vue normale de phpmyadmin
Amine
@Amine, TIMESTAMP est une valeur binaire, utilisant généralement 6 à 8 octets. La représentation de chaîne est juste cela, une représentation, tout comme la base de données ne stocke pas des entiers sous forme de chaînes. (À moins que vous ne mettiez le temps dans une colonne VARCHAR, et malheur à ceux qui essaient.)
SilverbackNet
1
Je note que CURRENT_TIMESTAMPrenvoie une datetimevaleur dans le fuseau horaire local de l'ordinateur. Cela devrait être évité. Utilisez à la place SYSUTCDATETIMEce qui renvoie un datetime2en UTC.
Dai
28

Alors que la réponse marquée est correcte avec:

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

Vous devez toujours être conscient des fuseaux horaires lorsque vous ajoutez des valeurs datetime par défaut dans une colonne.

Supposons, par exemple, que cette datetimevaleur soit conçue pour indiquer quand un membre a rejoint un site Web et que vous souhaitez qu'il soit affiché à l'utilisateur, GETDATE()vous donnera l'heure du serveur et pourrait afficher des écarts si l'utilisateur se trouve dans un environnement local différent du serveur.

Si vous prévoyez de traiter avec des utilisateurs internationaux, il est préférable dans certains cas d'utiliser GETUTCDATE () , qui:

Renvoie l'horodatage actuel du système de base de données en tant que valeur datetime. Le décalage de fuseau horaire de la base de données n'est pas inclus. Cette valeur représente l'heure UTC actuelle (temps universel coordonné). Cette valeur est dérivée du système d'exploitation de l'ordinateur sur lequel s'exécute l'instance de SQL Server.

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

Lors de la récupération des valeurs, l'application / site Web frontal doit transformer cette valeur de l'heure UTC en paramètres régionaux / culture de l'utilisateur qui la demande.

Tanneur
la source
19

Interdire les null sur la colonne et définir une valeur par défaut sur la colonne de 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
la source
Comment changeriez-vous cela pour changer le champ existant "date_crée"?
stephmoreland
@steph - Voir Modifier. Ma réponse précédente supposait qu'il s'agissait d'une nouvelle colonne. Vous devrez interdire les valeurs NULL pour que la valeur par défaut fonctionne, alors comment voulez-vous que les lignes préexistantes soient traitées?
Martin Smith
8

La syntaxe pour cela lors de la création d'une nouvelle table est:

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

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)
David Sopko
la source
Cela fonctionne aussi bien dans une instruction ALTER TABLE lors de l'ajout d'une nouvelle colonne.
Captain Sensible
7

Cela fonctionne pour moi ...

ALTER TABLE [accounts] 
 ADD [user_registered] DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;
dsixnine
la source
4

Cela fonctionne également:

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

Ou:

ALTER TABLE EXAMPLE ADD created datetime default GETDATE();
Keoma Borges
la source
4

Cela a fonctionné pour moi. J'utilise SQL Developer avec Oracle DB:

ALTER TABLE YOUR_TABLE
  ADD Date_Created TIMESTAMP  DEFAULT CURRENT_TIMESTAMP NOT NULL;
JavaGeek
la source
2

Pour le rendre plus simple à suivre, je résumerai les réponses ci-dessus:

Disons que la table s'appelle Client, elle a 4 colonnes / moins ou plus ...

vous voulez ajouter une nouvelle colonne à la table où chaque fois qu'il y a insertion ... alors cette colonne conserve un enregistrement de l'heure à laquelle l'événement s'est produit.

Solution:

ajoutez une nouvelle colonne, disons timepurchase est la nouvelle colonne, à la table avec le type de données datetime .

Exécutez ensuite la modification suivante:

ALTER TABLE Customer ADD CONSTRAINT DF_Customer DEFAULT GETDATE() FOR timePurchase
pas égoïste
la source
1

Disons que vous créez une table de base de données pour un système d'enregistrement.

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

Maintenant, quelques personnes s'inscrivent.

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

Ensuite, vous réalisez que vous avez besoin d'un horodatage pour le moment où ils se sont inscrits.

Si cette application est limitée à une région géographiquement localisée, vous pouvez utiliser l'heure du serveur local avec GETDATE(). Sinon, vous devez tenir compte de la considération de Tanner pour le public mondial avec GETUTCDATE()la valeur par défaut.

Ajoutez la colonne avec une valeur par défaut dans une déclaration comme cette réponse .

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

Obtenons un autre inscrit et voyons à quoi ressemblent les données.

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
la source
0

Dans SQLPlus lors de la création d'une table, c'est comme

SQL> créer un test de table

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

SQL> insérer dans les valeurs Test (id) (1);

 Test_ID Test_Date
       1 08-MAR-19
Osama Zafar
la source