Agregue el valor predeterminado del campo de fecha y hora en SQL Server a una marca de tiempo

265

Tengo una tabla que recopila formularios enviados desde nuestro sitio web, pero por alguna razón, cuando crearon la tabla, no pusieron una marca de tiempo en la tabla. Quiero que ingrese la fecha y hora exactas en que se ingresó el registro.

Sé que está allí en alguna parte, pero parece que no puedo encontrar cómo establecer el valor predeterminado (como en Access, usas getNow()o Now()) pero no sé dónde ponerlo.

Stephmoreland
fuente
Cuidado con las zonas horarias: stackoverflow.com/a/31296917/57475
Tanner

Respuestas:

332

Para modificar una columna existente en una tabla existente:

ALTER TABLE YourTable ADD CONSTRAINT DF_YourTable DEFAULT GETDATE() FOR YourColumn
La Q
fuente
2
@TheQ - Gracias. Entiendo que cambio "YourTable" al nombre de mi tabla, pero la parte que no entiendo es la restricción. ¿Qué es una restricción y modificaría su código para que coincida con el nombre de mi tabla?
stephmoreland 03 de
TheQLa respuesta de @steph - asume que estás alterando una columna existente que no creo que sea el caso. Vea mi respuesta para el código para agregar una nueva columna con esta restricción predeterminada.
Martin Smith
1
Para que una columna tenga un valor predeterminado, necesita una "restricción predeterminada", y este comando lo agregará. Puede nombrar la restricción como desee, Management Studio generalmente los nombra DF_TableName.
TheQ
@TheQ - Eso es perfecto, lo intentaré. Tenías razón, ya tengo el campo, pero quería aplicarle la corrección, no crear uno nuevo. ¡Gracias por todas sus respuestas!
stephmoreland 03 de
66
Si desea la marca de tiempo UTC en lugar de la hora local, puede usar en GETUTCDATE()lugar deGETDATE()
Cocowalla
147

Esto también se puede hacer a través de la GUI de SSMS.

  1. Ponga su tabla en vista de diseño (haga clic derecho en la tabla en el explorador de objetos-> Diseño )
  2. Agregue una columna a la tabla (o haga clic en la columna que desea actualizar si ya existe)
  3. En Propiedades de la columna, introduzca (getdate())en Valor predeterminado o vinculante campo como se muestra a continuación

Imagen de la mesa en vista de diseño

Tony L.
fuente
Buena pregunta. Intentaría dateadd(minute, 10, GetDate())ver si eso funciona.
Tony L.
En la vista de diseño del servidor sql lo probé, ¡dice que el valor debe coincidir con uno de los elementos de la lista! así que lo hice en la parte de atrás
shareef
92

En esa tabla en SQL Server, especifique el valor predeterminado de esa columna CURRENT_TIMESTAMP. El tipo de datos de esa columna puede ser datetime o datetime2.

p.ej

Create Table Student
(
  Name varchar(50),
  DateOfAddmission datetime default CURRENT_TIMESTAMP
);
Sanjay
fuente
1
Esto falla con el mensaje de error "No se puede convertir entre [B y TIMESTAMP]". Parece que CURRENT_TIMESTAMP es un valor binario, no una fecha y hora.
Sindri Traustason
TIMESTAMP le dará una entrada como esta: aaaa-mm-dd 00:00:00 UTC; y eso puede hacer que el DB sea tan grande; creo que se refería solo a la fecha aaaa-mm-dd; y el valor predeterminado para ello se puede configurar haciendo clic en "Como se define como" en la vista normal de phpmyadmin
Amine
@Amine, TIMESTAMP es un valor binario, que generalmente usa 6-8 bytes. La representación de cadena es solo eso, una representación, al igual que la base de datos no almacena enteros como cadenas. (A menos que ponga el tiempo en una columna VARCHAR, y ¡ay de aquellos que lo intenten!)
SilverbackNet
1
Observo que CURRENT_TIMESTAMPdevuelve un datetimevalor en la zona horaria local de la computadora. Debe ser evitado. En su lugar, use SYSUTCDATETIMEque devuelve un datetime2en UTC.
Dai
28

Si bien la respuesta marcada es correcta con:

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

Siempre debe tener en cuenta las zonas horarias al agregar valores predeterminados de fecha y hora en una columna.

Digamos, por ejemplo, que este datetimevalor está diseñado para indicar cuándo un miembro se unió a un sitio web y desea que se muestre nuevamente al usuario, GETDATE()le dará tiempo al servidor, por lo que podría mostrar discrepancias si el usuario se encuentra en una ubicación diferente al servidor.

Si espera tratar con usuarios internacionales, es mejor en algunos casos usar GETUTCDATE () , que:

Devuelve la marca de tiempo del sistema de base de datos actual como un valor de fecha y hora. El desplazamiento de zona horaria de la base de datos no está incluido. Este valor representa la hora UTC actual (hora universal coordinada). Este valor se deriva del sistema operativo de la computadora en la que se ejecuta la instancia de SQL Server.

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

Al recuperar los valores, la aplicación / sitio web front-end debe transformar este valor desde la hora UTC a la configuración regional / cultura del usuario que lo solicita.

Curtidor
fuente
19

No permitir nulos en la columna y establecer un valor predeterminado en la columna 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
fuente
¿Cómo alteraría eso para cambiar el campo existente "created_date"?
stephmoreland 03 de
@steph - Ver Editar. Mi respuesta anterior suponía que esta era una nueva columna. Necesitará no permitir NULL para que funcione el valor predeterminado, entonces, ¿cómo desea que se traten las filas preexistentes?
Martin Smith
8

La sintaxis para esto al crear una nueva tabla es:

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

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE()
)
David Sopko
fuente
Funciona igualmente bien en una instrucción ALTER TABLE cuando agrega una nueva columna.
Captain Sensible
7

Esto funciona para mi ...

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

Esto también funciona:

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

O:

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

Esto funcionó para mí. Estoy usando SQL Developer con Oracle DB:

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

Para que sea más fácil de seguir, resumiré las respuestas anteriores:

Digamos que la tabla se llama Cliente , tiene 4 columnas / menos o más ...

desea agregar una nueva columna a la tabla donde cada vez que hay una inserción ... esa columna mantiene un registro de la hora en que ocurrió el evento.

Solución:

agregue una nueva columna, digamos que timepurchase es la nueva columna, a la tabla con el tipo de datos datetime .

Luego ejecute el siguiente alter:

ALTER TABLE Customer ADD CONSTRAINT DF_Customer DEFAULT GETDATE() FOR timePurchase
no egoísta
fuente
1

Supongamos que crea una tabla de base de datos para un sistema de registro.

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

Ahora un par de personas se registran.

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

Entonces te das cuenta de que necesitas una marca de tiempo para cuando se registraron.

Si esta aplicación se limita a una región geográficamente localizada, puede usar la hora del servidor local con GETDATE(). De lo contrario, debe prestar atención a la consideración de Tanner para la audiencia global conGETUTCDATE() el valor predeterminado.

Agregue la columna con un valor predeterminado en una declaración como esta respuesta .

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

Consigamos otro registrante y veamos cómo se ven los datos.

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

En SQLPlus al crear una tabla es como

SQL> crear tabla de prueba

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

SQL> insertar en los valores de prueba (id) (1);

 Test_ID Test_Date
       1 08-MAR-19
Osama Zafar
fuente