Fügen Sie einem Zeitstempel den Standardwert des Datums- / Uhrzeitfelds in SQL Server hinzu

265

Ich habe eine Tabelle, in der von unserer Website eingereichte Formulare gesammelt werden, aber aus irgendeinem Grund haben sie beim Erstellen der Tabelle keinen Zeitstempel in die Tabelle eingefügt. Ich möchte, dass das genaue Datum und die Uhrzeit der Eingabe des Datensatzes eingegeben werden.

Ich weiß, dass es irgendwo drin ist, aber ich kann anscheinend nicht herausfinden, wie der Standardwert festgelegt werden soll (wie in Access, den Sie verwenden getNow()oder Now()), aber ich weiß nicht, wo ich ihn ablegen soll.

Stephmoreland
quelle
Vorsicht vor Zeitzonen: stackoverflow.com/a/31296917/57475
Tanner

Antworten:

332

So ändern Sie eine vorhandene Spalte in einer vorhandenen Tabelle:

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn
Das Q
quelle
2
@ TheQ - Danke. Ich verstehe, dass ich "YourTable" in meinen Tabellennamen ändere, aber der Teil, den ich nicht verstehe, ist die Einschränkung. Was ist eine Einschränkung und würde ich Ihren Code so ändern, dass er mit dem Namen meiner Tabelle übereinstimmt?
Stephmoreland
Die TheQAntwort von @steph - geht davon aus, dass Sie eine vorhandene Spalte ändern, was meiner Meinung nach nicht der Fall ist. In meiner Antwort finden Sie den Code zum Hinzufügen einer neuen Spalte mit dieser Standardeinschränkung.
Martin Smith
1
Damit eine Spalte einen Standardwert hat, benötigt sie eine "Standardeinschränkung", und dieser Befehl fügt diese hinzu. Sie können die Einschränkung beliebig benennen. Management Studio nennt sie normalerweise DF_TableName.
TheQ
@TheQ - Das ist perfekt, ich werde es versuchen. Sie hatten Recht, ich habe das Feld bereits, aber ich wollte das Update darauf anwenden und kein neues erstellen. Vielen Dank für alle Ihre Antworten!
Stephmoreland
6
Wenn Sie den UTC-Zeitstempel anstelle der Ortszeit möchten, können Sie GETUTCDATE()anstelle vonGETDATE()
Cocowalla
147

Dies kann auch über die SSMS-GUI erfolgen.

  1. Platzieren Sie Ihre Tabelle in der Entwurfsansicht (Klicken Sie mit der rechten Maustaste auf die Tabelle im Objekt-Explorer-> Entwurf ).
  2. Fügen Sie der Tabelle eine Spalte hinzu (oder klicken Sie auf die Spalte, die Sie aktualisieren möchten, falls diese bereits vorhanden ist).
  3. In Spalteneigenschaften, geben Sie (getdate())in Standardwert oder Binding Feld wie unten abgebildet

Bild der Tabelle in der Entwurfsansicht

Tony L.
quelle
Gute Frage. Ich würde versuchen dateadd(minute, 10, GetDate())zu sehen, ob das funktioniert.
Tony L.
In der SQL Server Design-Ansicht habe ich es versucht, es heißt, der Wert muss mit einem der Elemente in der Liste übereinstimmen!
Also habe
92

Geben Sie in dieser Tabelle in SQL Server den Standardwert dieser Spalte an CURRENT_TIMESTAMP. Der Datentyp dieser Spalte kann datetime oder datetime2 sein.

z.B

Create Table Student
(
  Name varchar(50),
  DateOfAddmission datetime default CURRENT_TIMESTAMP
);
Sanjay
quelle
1
Dies schlägt mit der Fehlermeldung "Konvertierung zwischen [B und TIMESTAMP] nicht möglich" fehl. Es scheint, dass CURRENT_TIMESTAMP ein Binärwert ist, keine Datums- / Uhrzeitangabe.
Sindri Traustason
TIMESTAMP gibt Ihnen eine Eingabe wie folgt: JJJJ-MM-TT 00:00:00 UTC; und das kann die DB so groß machen; ich denke, er meinte nur das Datum JJJJ-MM-TT; und der Standardwert dafür kann durch Klicken auf "Wie definiert als" in der normalen Ansicht von phpmyadmin
Amine
@Amine, TIMESTAMP ist ein Binärwert, der normalerweise 6-8 Bytes verwendet. Die Zeichenfolgendarstellung ist genau das, eine Darstellung, genau wie die Datenbank keine Ganzzahlen als Zeichenfolgen speichert. (Es sei denn, Sie schreiben die Zeit in eine VARCHAR-Spalte und wehe denen, die es versuchen.)
SilverbackNet
1
Ich stelle fest, dass CURRENT_TIMESTAMPein datetimeWert in der lokalen Zeitzone des Computers zurückgegeben wird. Es sollte vermieden werden. Verwenden Sie stattdessen, SYSUTCDATETIMEwas ein datetime2in UTC zurückgibt .
Dai
28

Während die markierte Antwort korrekt ist mit:

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

Sie sollten immer Zeitzonen kennen, wenn Sie einer Spalte Standardwerte für Datum und Uhrzeit hinzufügen.

Angenommen, dieser datetimeWert gibt an, wann ein Mitglied einer Website beigetreten ist und GETDATE()ob er dem Benutzer wieder angezeigt werden soll. Dadurch wird Ihnen die Serverzeit angezeigt, sodass möglicherweise Unstimmigkeiten auftreten, wenn sich der Benutzer in einem anderen Gebietsschema als der Server befindet.

Wenn Sie mit internationalen Nutzern zu tun erwarten, ist es in manchen Fällen besser zu nutzen GETUTCDATE () , wobei:

Gibt den aktuellen Zeitstempel des Datenbanksystems als Datum / Uhrzeit-Wert zurück. Der Zeitzonenversatz der Datenbank ist nicht enthalten. Dieser Wert repräsentiert die aktuelle UTC-Zeit (Coordinated Universal Time). Dieser Wert wird vom Betriebssystem des Computers abgeleitet, auf dem die Instanz von SQL Server ausgeführt wird.

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

Beim Abrufen der Werte sollte die Front-End-Anwendung / Website diesen Wert von der UTC-Zeit in das Gebietsschema / die Kultur des Benutzers umwandeln, der ihn anfordert.

Gerber
quelle
19

Lassen Sie Nullen in der Spalte nicht zu und legen Sie einen Standardwert für die Spalte von fest 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
quelle
Wie würden Sie das ändern, um das vorhandene Feld "created_date" zu ändern?
Stephmoreland
@steph - Siehe Bearbeiten. Meine vorherige Antwort ging davon aus, dass dies eine neue Spalte war. Sie müssen NULL-Werte nicht zulassen, damit die Standardeinstellung funktioniert. Wie sollen also bereits vorhandene Zeilen behandelt werden?
Martin Smith
8

Die Syntax hierfür beim Erstellen einer neuen Tabelle lautet:

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

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)
David Sopko
quelle
Es funktioniert genauso gut in einer ALTER TABLE-Anweisung, wenn eine neue Spalte hinzugefügt wird.
Captain Sensible
7

Das funktioniert bei mir ...

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

Dies funktioniert auch:

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

Oder:

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

Das hat bei mir funktioniert. Ich verwende SQL Developer mit Oracle DB:

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

Um es einfacher zu folgen, werde ich zusammenfassen , die oben genannten Antworten:

Nehmen wir an, die Tabelle heißt Kunde und hat 4 Spalten / weniger oder mehr ...

Sie möchten der Tabelle eine neue Spalte hinzufügen, in der jedes Mal, wenn eingefügt wird, in dieser Spalte der Zeitpunkt des Ereignisses aufgezeichnet wird.

Lösung:

Fügen Sie der Tabelle mit dem Datentyp datetime eine neue Spalte hinzu. Nehmen wir an, Timepurchase ist die neue Spalte .

Führen Sie dann die folgende Änderung aus:

ALTER TABLE Customer ADD CONSTRAINT DF_Customer DEFAULT GETDATE() FOR timePurchase
nicht egoistisch
quelle
1

Angenommen, Sie erstellen eine Datenbanktabelle für ein Registrierungssystem.

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

Jetzt registrieren sich ein paar Leute.

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

Dann stellen Sie fest, dass Sie einen Zeitstempel für die Registrierung benötigen.

Wenn diese App auf eine geografisch lokalisierte Region beschränkt ist, können Sie die lokale Serverzeit mit verwenden GETDATE(). Andernfalls sollten Sie Tanners Berücksichtigung für das globale Publikum mit GETUTCDATE()dem Standardwert beachten .

Fügen Sie die Spalte mit einem Standardwert in einer Anweisung wie dieser Antwort hinzu .

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

Lassen Sie uns einen anderen Registranten holen und sehen, wie die Daten aussehen.

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
quelle
0

In SQLPlus ist es beim Erstellen einer Tabelle wie folgt

SQL> Tabelle erstellen Test

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

SQL> Einfügen in Test (id) -Werte (1);

 Test_ID Test_Date
       1 08-MAR-19
Osama Zafar
quelle