sql - ¿Cuál es el misterioso tipo de datos ''timestamp'' en Sybase?
(5)
Recientemente descubrí una tabla en nuestra base de datos de Sybase en el trabajo que usa una columna de tipo ''marca de tiempo''. Si creo una tabla usando este tipo de datos de marca de tiempo misterioso como este
create table dropme (
foo timestamp,
roo int null
)
insert into dropme (roo) values(123)
insert into dropme (roo) values(122)
insert into dropme (roo) values(121)
select * from dropme
go
Obtengo lo siguiente de ''select * from dropme'':
foo roo
-------------------- -----------
0x000100000e1ce4ea 123
0x000100000e1ce4ed 122
0x000100000e1ce509 121
0x000100000e1ce4ea no se ve muy bien para mí. Además, veo esta salida de ''sp_help timestamp'':
Type_name Storage_type Length Prec Scale Nulls Default_name Rule_name Access_Rule_name Identity
--------- ------------ ------ ---- ----- ----- ------------ --------- ---------------- ----------
timestamp varbinary 8 NULL NULL 1 NULL NULL NULL NULL
Mis preguntas son las siguientes
- ¿Qué diablos es una marca de tiempo?
- ¿Tiene alguna relación con la hora o la fecha?
- ¿Puedo convertirlo a datetime?
- Si no es una hora o una fecha, ¿para qué la usas?
(Esta es una respuesta publicada como una pregunta separada Respuestas a las preguntas misteriosas de tipo de fecha y hora de Sybase ASE por parte de un usuario sin el representante para agregarlo aquí. Lo copié como Community Wiki ya que no quiero reclamar crédito por ello pero debería estar aquí)
Responda a la pregunta # 1: ''¿Qué diablos es la marca de tiempo?''
• La marca de tiempo de una base de datos de Sybase ASE se guarda de manera central en una tabla interna de la base de datos de esa base de datos: esta tabla se crea cuando una base de datos se pone en línea. Puede consultar la marca de tiempo de la base de datos actual seleccionando @@ dbts. Tenga en cuenta que este valor de marca de tiempo varbinary (8) ''Base de datos'' depende de la plataforma, es decir, está sujeto a endianness Big versus Small.
• Cada tabla de usuario puede tener una columna de marca de tiempo para mantener los valores de marca de tiempo de ''Base de datos'' de INSERT / UPDATE de una fila dada. Todos los valores de la columna de marca de tiempo ''Tabla'' se mantienen automáticamente por ASE (al igual que la columna de identidad) al completar con éxito un comando DML de TSQL. Sin embargo, a diferencia de la marca de tiempo ''Base de datos'', los valores de marca de tiempo ''Tabla'' son independientes de la plataforma, ya que siempre se conservan en orden de bytes Big-endian independientemente de la endianidad de la plataforma O / S (consulte la información adicional a continuación para obtener más información).
Respuesta a la pregunta 2: "¿Tiene alguna relación con la hora o la fecha?"
No, los valores de la marca de tiempo ''Base de datos'' y las marcas de tiempo ''Local'' de la página no reflejan la fecha / hora real.
Respuesta a la Q # 3: ''¿Puedo convertirlo a una fecha y hora?''
No, no puede convertir la marca de tiempo ''Base de datos'' o las marcas de tiempo ''Local'' de sus páginas en valor de fecha / hora.
Responda a la pregunta 4: "Si no es una hora o una fecha, ¿para qué la usa?"
• La marca de tiempo ''Base de datos'' se incrementa en uno cada vez que se modifica o crea una página dentro de una base de datos, mientras que la marca de tiempo ''Local'' de la página afectada (dentro de su encabezado de página) se sincroniza con la marca de tiempo ''Base de datos'' de ese momento.
• Cuando se compara con la marca de tiempo ''Base de datos'' en el momento actual, la marca de tiempo ''Local'' de una página de la base de datos refleja la antigüedad relativa de la última actualización o la primera creación de esa página; por lo tanto, ASE puede indicar el orden cronológico de actualizaciones / creaciones para todas las páginas dentro de una base de datos.
• La aplicación puede hacer uso de la columna de marca de tiempo ''Tabla'' de manera similar a la columna de identidad para encontrar las filas insertadas / actualizadas más recientemente o menos recientemente, independientemente de los valores clave de las filas.
Más información, advertencias y advertencias: -
(1) Las marcas de tiempo ''Base de datos'' y ''Local'' se almacenan en 3 partes y son dependientes de la plataforma OS. por ejemplo, 0xHHHH 0000 LLLLLLLL
- 2 bytes de alto orden - 0xHHHH
- Relleno de 2 bytes - 0x0000
- 4 bytes de orden inferior - 0xLLLLLLLL
(2) La marca de tiempo ''Tabla'' del usuario también se almacena en 3 partes, pero siempre está en orientación Big-endian. por ejemplo, 0x0000 HHHH LLLLLLLL
- Relleno de 2 bytes - 0x0000
- 2 bytes de alto orden - 0xHHHH
- 4 bytes de orden inferior - 0xLLLLLLLL
(3) La marca de tiempo de la base de datos se guarda en una tabla de tabla de sistema en memoria de una base de datos determinada (que se crea cuando una base de datos se pone en línea).
- Nota1: los valores de columna de marca de tiempo de "tabla" se mantienen como otros valores de columna en las páginas de datos y / o índice de la tabla de base de datos, en la que se define la columna de marca de tiempo.
- Nota2: tenga en cuenta que al consultar la marca de tiempo ''Base de datos'' de la base de datos actual mediante SELECT @@ dbts, se obtiene su representación hexadecimal, que está sujeta a la Endianness de la plataforma del sistema operativo.
- Nota 3 - En contraste, al consultar la marca de tiempo ''Base de datos'' por DBCC dbtable (no recomendado), se obtiene su representación hexadecimal de Big-endian, por lo tanto, es independiente de la plataforma.
- ADVERTENCIA: cuando la marca de tiempo ''Base de datos'' de una base de datos determinada se acerca a su límite máximo, es decir (0xFFFF, 0xFFFFFFFF), y puede tardar una década o más en llegar a este punto, según las frecuencias de las operaciones de inserción / actualización dentro de la base de datos, el ASE envíe una advertencia y ya no será posible insertar / actualizar más. La única opción es exportar los datos de todos los objetos utilizando BCP (más los procedimientos almacenados a través de sp_showtext), eliminar la base de datos, crearla de nuevo (con la nueva ''Base de datos near-zer'' marca de tiempo) e importar los datos (y procedimientos almacenados).
FYI: las respuestas, sugerencias y consejos anteriores son auténticos y precisos, ya que trabajé para Sybase y ahora trabajo SAP, que es el propietario del producto ASE.
Digamos que traes los datos a tu aplicación. ¿Después de hacer algo, desea asegurarse de que este registro se haya modificado hasta que obtenga (en un nivel bajo)?
En este caso debes tener una columna TIMESTAMP . Primero tienes que guardar esa columna. Justo antes de actualizar los datos debe comparar cada valor para asegurarse.
Es por eso que este tipo de datos existe!
En Sybase ASE, la marca de tiempo tiene diferentes valores para diferentes bases de datos en el mismo servidor.
usar database_name
ir
seleccione @@ dbts
por lo tanto, es obvio que no está relacionado con Unix Epoch ni con ninguna otra referencia relacionada con el tiempo.
Es diferente de la marca de tiempo de Sybase SQL Anywhere.
Recientemente, alguien me preguntó si es posible convertir el tipo de datos TIMESTAMP SYBASE IQ a DATE; Siempre he evitado este tipo de datos porque es la oscuridad. Después de un par de horas leyendo la documentación de SYBASE y haciendo algunas pruebas, aquí están mis conclusiones:
El TIMESTAMP:
- Es un número de 12 dígitos, almacenado como BINARIO (esto podría variar dependiendo del entorno)
- Representa un valor en microsegundos desde 1970 1 de enero.
- Sybase no incluye funciones directas para convertirlas.
- Se establece automáticamente cada vez que se inserta un registro.
Aquí está la oración SQL para convertir TIMESTAMP a DATE:
SELECT timestamp as TS, CONVERT(decimal, timestamp) as TS_IN_MS,
CONVERT(date, dateadd(SS, CONVERT(int, SUBSTRING(CONVERT(varchar,
CONVERT(decimal, timestamp)), 1, 9)), ''1/1/1970''), 123) as TS_AS_DATE
FROM TheTable
La conversión se puede probar utilizando un convertidor de EPOCH en línea como el siguiente:
- http://www.fileformat.info/tip/java/date2millis.htm
- http://www.esqsoft.com/javascript_examples/date-to-epoch.htm
Nota : En el caso de SYBASE ASE , el tipo TIMESTAMP no es un UNIX-EPOCH válido.
¿Qué diablos es una marca de tiempo?
El tipo de datos de marca de tiempo se define como
varbinary(8) null
¿Tiene alguna relación con la hora o la fecha?
No. El nombre fue mal elegido.
¿Puedo convertirlo a datetime?
No.
Si no es una hora o una fecha, ¿para qué la usas?
Cada vez que se inserta o actualiza una fila con una columna de marca de tiempo, la columna de marca de tiempo se actualiza automáticamente. Tenga en cuenta que en realidad hay dos tipos de marcas de tiempo. TIMESTAMP
y TIMESTAMP
CURRENT TIMESTAMP
. La diferencia es que el CURRENT TIMESTAMP
solo se establece en la inserción.
La documentation Sybase se detuvo allí, y me pregunto por qué el f * rainbow! * K alguien usaría la marca de tiempo del tipo de datos. Afortunadamente, encontré algunas other discussions y deduje su uso al implementar el control de concurrencia optimista.
El control de concurrencia es un método para asegurar que múltiples transacciones puedan ejecutarse al mismo tiempo y al mismo tiempo dar como resultado datos correctos. El control de concurrencia optimista es un método de control de concurrencia que asume que varias transacciones pueden completarse sin interferir entre sí. Es decir, no se requiere bloqueo. Wikipedia describe el siguiente algoritmo:
- Registre una marca de fecha / hora cuando comienza la transacción
- Leer / actualizar datos
- Compruebe si otra transacción modificó los datos
- Confirmar o revertir
El tipo de datos de marca de tiempo de Sybase podría usarse en los pasos 1 y 3 de este algoritmo en lugar de usar una fecha / hora. Pero no me parece que le ahorre mucho trabajo sobre el uso de un tipo de datos de fecha y hora. Supongo que podría funcionar mejor.