2011-02-03 19 views
151

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.Agregue el valor predeterminado del campo datetime en SQL Server a una marca de tiempo

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

Respuesta

214

Para modificar una columna existente en una tabla existente:

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

@TheQ - Gracias. Entiendo que cambie "YourTable" por el nombre de mi tabla, pero la parte que no entiendo es la Restricción. ¿Qué es una restricción y voy a modificar tu código para que coincida con el nombre de mi tabla? – stephmoreland

+0

@steph - ¿La respuesta de 'TheQ' supone que está 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. –

+1

Para que una columna tenga un valor predeterminado, necesita una "restricción predeterminada", y este comando agregará eso. Puede asignarle el nombre que desee a la restricción, Management Studio generalmente los denomina DF_TableName. – TheQ

15

No permitir valores nulos en la columna y establecer un defecto en la columna de 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

¿Cómo se altera que para cambiar el campo existente "created_date"? – stephmoreland

+0

@steph - Ver Editar. Mi respuesta anterior suponía que esta era una nueva columna. Necesitará rechazar que los valores NULL funcionen de manera predeterminada, entonces, ¿cómo desea tratar las filas preexistentes? –

62

En esa tabla en SQL Server, especifique el valor por defecto de esa columna para que sea CURRENT_TIMESTAMP. DataType de esa columna puede ser datetime o datetime2.

p. Ej.

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

Espero que funcione.

+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. –

+0

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 solo quiso decir la fecha aaaa-mm-dd; y el valor predeterminado para él se puede establecer haciendo clic en "Como se define como" en la vista normal de phpmyadmin – Amine

5

La sintaxis de este cuando se crea una nueva tabla es:

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

    CreateDate DATETIME NOT NULL CONSTRAINT DF_MyTable_CreateDate_GETDATE DEFAULT GETDATE() 
) 
+0

Funciona igual de bien en una sentencia ALTER TABLE al agregar una nueva columna. –

2

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

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

desea agregar una nueva columna a la tabla donde cada vez que hay inserción ... entonces esa columna registra el momento en que ocurrió el evento.

Solución:

añadir nueva columna, que `s dicen timePurchase es la nueva columna, a la mesa con el tipo de datos de fecha y hora .

A continuación, ejecute el siguiente alter:

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

Esto también se puede hacer a través de la interfaz gráfica de usuario SSMS.

  1. Deja tus tabla en la vista de diseño (Haga clic derecho sobre la tabla en el objeto Explorer de> Diseño )
  2. Agregar 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 Encuadernación campo como se muestra a continuación

enter image description here

+1

Cada vez que vuelvo aquí solo para verificar cómo lo hago en la GUI. Gracias Tony. – Daidon

11

Mientras que el marked answer es correcta con:

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

Usted siempre debe estar al tanto de las zonas horarias al agregar los valores de fecha y hora por defecto para una columna.

decir, por ejemplo, este valor datetime está diseñado para indicar cuando un miembro se unió a un sitio web y desea que se muestre al usuario, GETDATE() le dará la hora del servidor así que podría mostrar discrepancias si el usuario se encuentra en una ubicación diferente al servidor.

Si va a tratar con los usuarios internacionales, es mejor en algunos casos utilizar GETUTCDATE(), que:

Devuelve la fecha y hora actual sistema de base de datos como un valor de fecha y hora. La compensación de zona horaria de la base de datos no está incluida. Este valor representa la hora UTC actual (Tiempo Universal Coordinado). Este valor se deriva del sistema operativo de la computadora en la que se está ejecutando la instancia de SQL Server.

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

Al recuperar los valores, la aplicación final/sitio web frontal debe transformar este valor a partir de la hora UTC en el entorno local/cultura de que el usuario lo solicite.

2

Esto también funciona:

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

O:

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

Digamos que se 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 se da cuenta de que necesita una marca de tiempo para cuando se registraron.

Si esta aplicación está limitada a una región geográficamente localizada, entonces puede utilice la hora del servidor local con GETDATE(). De lo contrario, debe prestar atención al Tanner's consideration para la audiencia global con GETUTCDATE() para el valor predeterminado.

Agregue la columna con un valor predeterminado en una declaración como this answer.

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

Busquemos otro registrante y veamos cómo son 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 
2

Esto funciona para mí ...

ALTER TABLE `accounts` ADD `user_registered` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ; 
Cuestiones relacionadas