tipo - obtener solo hora y minutos sql server
¿Hay alguna forma de obtener el valor de DateTime a partir de la columna de tipo timestamp? (8)
Creo que su mejor opción es restaurar una copia de seguridad antes de las inserciones y comparar la tabla con la tabla actual.
Necesito una tabla select from que no tenga una columna que indique cuándo se insertó la fila, solo la columna timestamp
(valores como: 0x0000000000530278). Algunos datos se importaron ayer a la tabla y ahora necesito averiguar qué se importó exactamente :(
¿Hay alguna forma de hacerlo utilizando solo la información de timestamp
? Aquí encontré que:
- Timestamp es un número hexadecimal hexadecimal de 8 bytes, que no tiene nada que ver ni con la fecha ni con la hora.
- Para obtener el valor actual de la marca de tiempo, use: @@ DBTS.
Tal vez hay una manera de encontrar lo que era el valor de la timestamp
alrededor del tiempo específico? Eso ayudaría a formar un selecto. ¿O tal vez hay una solución bien conocida?
El tipo de datos de marca de tiempo de Transact-SQL es un tipo de datos binarios sin valores relacionados con el tiempo.
Entonces, para responder a su pregunta: ¿Hay alguna forma de obtener el valor de DateTime a partir de la columna de tipo timestamp?
La respuesta es: no
El tipo de datos de marca de tiempo en SQL Server 2005 es un sinónimo de rowversion y es solo un número que se incrementa automáticamente con cada actualización de fila.
Puedes lanzarlo a bigint para ver su valor.
Para obtener lo que desea para las filas nuevas o actualizadas, debe agregar de forma reproducible otra columna de fecha y hora (lastupdate) y un activador para actualizar esa columna con cada actualización.
Para las filas que ya se han insertado en el pasado, no creo que pueda hacer algo para encontrar la hora exacta.
Me temo que no es posible convertir / lanzar un TIMESTAMP a DATETIME. Tienen usos e implementaciones completamente diferentes que son incompatibles.
Consulte este enlace http://www.sqlteam.com/article/timestamps-vs-datetime-data-types
Los libros en línea también dicen http://msdn.microsoft.com/en-us/library/aa260631.aspx
El tipo de datos de marca de tiempo de SQL Server no tiene nada que ver con las horas o las fechas. Las marcas de tiempo de SQL Server son números binarios que indican la secuencia relativa en la que las modificaciones de datos tuvieron lugar en una base de datos. El tipo de datos de marca de tiempo se implementó originalmente para admitir los algoritmos de recuperación de SQL Server.
Otra respuesta a tu pregunta:
Si la columna de marca de tiempo es el único recurso para su recuperación (sin copias de seguridad, etc.), puede intentar utilizar la siguiente lógica
La marca de tiempo es simplemente el valor de un contador que se incrementa para cada inserción o operación de actualización que se realiza en una tabla que contiene una columna de marca de tiempo .
Si la importación de datos que ocurrió ayer fue una inserción de varios registros, puede ver una secuencia de números en la columna de marca de tiempo, como por ejemplo:
0x00000000000007D1
0x00000000000007D2
0x00000000000007D3
0x00000000000007D4
0x00000000000007D5
La secuencia más reciente puede ser su información adicional (por supuesto, no está garantizada). Puede combinar ese conocimiento con otras cosas (como la columna de incremento automático si las usa) para identificar los registros que le interesan.
Para identificar nuevas filas por fecha y hora, debe hacer un seguimiento de las marcas de tiempo que estaban allí de antemano. En un apuro podrías:
- Restaure una versión anterior en otro lugar.
- Copie los datos de ambas tablas en una base de datos temporal.
- Identifique los datos insertados de las marcas de tiempo presentes en uno pero no en el otro.
Con un riesgo menor de falsos positivos si algo más ha estado sucediendo en la base de datos, esto le dará una diferencia razonablemente buena.
Para una verificación más robusta, puede calcular los valores hash MD5 o SHA-1 con Hashbytes en el contenido de la fila para obtener una diferencia con muy baja probabilidad de colisión (consulte este artículo de Wikipedia sobre los ataques de cumpleaños para una discusión sobre este problema).
Sé que es demasiado tarde pero podría ayudar a alguien más.
Timestamp / RowVersion se puede convertir a BigInt, pero en cualquier caso no se puede comparar con datetime.
La siguiente declaración se toma de MSDN
El tipo de datos rowversion de Transact-SQL no es un tipo de datos de fecha u hora. timestamp es un sinónimo en desuso para rowversion .
Para más detalles, consulte aquí
Otras personas señalaron correctamente que la marca de tiempo es un contador binario. Sin embargo, si en cualquier tabla de su base de datos tiene la fecha y la hora en que se registró, puede usar esa información para pasar de cualquier marca de tiempo a un rango de fechas. Una tabla de registro es un buen candidato para este propósito. Suponiendo que su tabla de importación es "facturas", puede usar una consulta como la siguiente:
WITH TS
AS
(
SELECT
L1.LastDateUpdated, COALESCE(L2.LastDateUpdated, {TS ''2099-12-31 00:00:00''}) as LastDateUpdatedTo,
L1.[TIMESTAMP], L2.[TIMESTAMP] as [TIMESTAMPTo]
FROM
(
SELECT L1.[LastDateUpdated]
,L1.[TIMESTAMP]
,ROW_NUMBER() OVER (ORDER BY L1.[LastDateUpdated]) ID
FROM [Log] L1
) L1
left join
(
SELECT L2.[LastDateUpdated]
,L2.[TIMESTAMP]
,ROW_NUMBER() OVER (ORDER BY L2.[LastDateUpdated]) ID
FROM [Log] L2
) L2
ON L1.ID = L2.ID - 1
)
SELECT TS.LastDateUpdated, TS.LastDateUpdatedTo, * from [Invoices]
inner join TS ON [Invoices].Timestamp between TS.Timestamp and
TS.TIMESTAMPTo
ORDER BY TS.TIMESTAMPTo DESC