2011-09-11 9 views
9

Tengo una tabla donde cada fila necesita una marca de tiempo marcando el tiempo que se ha insertado. No tengo mucha experiencia con la base de datos, pero algo me dice que esto mejor sería manejado automáticamente en el lado de la base de datos, por ejemplo, a través de un procedimiento almacenado.¿Cómo puedo almacenar/recuperar una marca de tiempo en SQL Server?

Hay un tipo de datos de marca de tiempo en MS SQL, pero al leer sobre él, se trata como una serie de números y no como un objeto DateTime en C#. Entonces, ¿no podría ser simplemente un tipo de datos NVARCHAR si de todos modos tengo que hacer la conversión?

En pocas palabras, ¿cuál es la forma más fácil de (automáticamente?) Poner una marca de tiempo en una fila cuando se inserta en una tabla?

Editar: la definición de tabla es muy simple. Solo tiene dos columnas en este momento y todavía carece de la columna de marca de tiempo.

 SqlCommand command = con.CreateCommand(); 
     command.CommandText = "INSERT INTO Bio VALUES (" + 
      "@ID, @Name)"; 

     command.Parameters.AddWithValue("ID",number); 
     command.Parameters.AddWithValue("Name", name); 

     try 
     { 
      SqlDataReader thisReader = command.ExecuteReader(); 
      thisReader.Close(); 
     } 
     catch { // Do something }; 

Solución bien, funciona ahora. Primero intenté agregar la nueva columna a través de la ventana Server Explorer en Visual Studio 2008. Al encontrar mi base de datos, haga clic con el botón derecho y seleccione "Nueva consulta". Entonces, al escribir algo así como

ALTER TABLE dbo.MyTable ADD CreatedDate datetime NOT NULL DEFAULT (GetUtcDate()) 

pero me dio el mensaje de que

La construcción ALTER TABLE de SQL no es compatible La consulta no se puede representar gráficamente en el panel Diagrama y Criterios.

Así que, en cambio, lo agregué gráficamente. Primero, "Definición de tabla abierta" y agregando CreatedDate en Nombre de columna y fecha y hora en Tipo de datos. Eliminando la verificación Permitir nulos. Luego, en las Propiedades de la columna añadí

getutcdate() 

en la sección general en la fila denominada "Valor por omisión o unión". Cada vez que se inserta una nueva fila, la base de datos le da automáticamente la fecha y hora actual como una marca de tiempo.

Respuesta

8

que tienen una columna CreatedDate en una tabla crear de esta manera:

ALTER TABLE dbo.MyTable ADD CreatedDate datetime NOT NULL DEFAULT (GetUtcDate()) 

Editar: si posteriormente desea tener el valor actualizado en cada actualización de ese registro puede reasignar GETUTCDATE() para esa columna o a otra (lo llamé Createddate por lo que no debería usarse en la actualización, pero puede agregar otra o cambiarle el nombre a Modifieddate). Definitivamente incluiría la actualización de dicha columna en el procedimiento almacenado que hace el UPDATE, sin necesidad de desencadenantes aquí.

+0

Intenté utilizar esta línea de comando, pero encontré que el editor gráfico era más fácil. Lo que hice se agrega al final de la pregunta original. Gracias por la ayuda. –

+1

Sé que esta es una pregunta muy antigua, ¡pero una respuesta fantástica! – Tom

1

Puede usar CURRENT_TIMESTAMP o FN NOW() para insertar la marca de tiempo en una fila.

6

El tipo de "indicación de fecha y hora" de SQL Server no es el mismo que el "timestamp" estándar: es más correcto "rowversion". El tipo de datos "timestamp" está en desuso.See MSDN for all of this

Debe utilizar datetime which is a real date/time value

La manera más fácil es tener un incumplimiento de la columna con GETDATE o GETUTCDATE sobre la mesa para que SQL Server mantiene automáticamente

Editar: para las actualizaciones

Puede usar esta sintaxis para las actualizaciones

UPDATE T SET col = @x, UpdatedDateTime = DEFAULT WHERE ... 

Esto es útil porque la defa La restricción ULT determina el valor, no el código. Por lo tanto, si cambia el valor predeterminado (digamos que pasa a GETUTCDATE desde GETDATE), cambia una restricción, no el código

+0

Gracias. Esto fue muy esclarecedor. –

1

Crear un desencadenante es una manera, aunque probablemente no la mejor, de manejar esto en el lado SQL si también quieren actualizar la marca de tiempo cuando se actualiza una fila:

CREATE TRIGGER MyTimestampTrigger ON tblMyTable FOR INSERT,UPDATE AS 
UPDATE tblMyTable SET fldTimestamp=getdate() WHERE fldId IN (SELECT fldId FROM INSERTED) 
GO 

(Si fldID es la clave principal, fldTimestamp es el campo de marca de tiempo y tblMyTable el nombre de la tabla).

Sin embargo, la otra respuesta con un valor predeterminado en una columna de fecha y hora es su mejor opción.

+0

Para ACTUALIZAR puede utilizar la palabra clave DEFAULT 'UPDATE T SET col = @x, UpdatedDateTime = DEFAULT WHERE ...' en lugar de un desencadenante – gbn

+1

que en realidad no sabía. Esa es una mejor solución de hecho. – DeCaf

+0

Interesante. Sin embargo, el asunto es que solo quiero agregar muchas filas a la mesa. Se usará con fines estadísticos, de modo que siempre que vea el evento X, se agrega una nueva columna con X como ID y se da una marca de tiempo. No hay edición de filas porque quiero poder recuperar más adelante todos los datos sobre X, así sé todas las fechas y las horas en que ocurrió. Es por eso que fui con la otra solución. –

Cuestiones relacionadas