Consulta de MS SQL con datos de marca de tiempo/fechahora/fechaHola a todos,
queremos guardar una tabla de datos en una base de datos y luego consultar la base de datos (usando MS SQL) para recuperar la tabla. Dado que tenemos algunos problemas al transferir la marca de tiempo a la base de datos, configuramos una solución alternativa. En primer lugar, la tabla en JMP tiene una columna de "fecha" llamada "SecondsSince1904", donde la fecha y hora se almacena como segundos transcurridos desde la época de 1904 (01.01.1904 00:00:00). Esta columna tiene el formato "Dic fijo (30,0)". Para transferir la tabla de datos a la base de datos, utilizamos el siguiente script:
Names Default To Here(1);
dt = Current Data Table();
// This will delete the table "yourTable" in the database. BE CAREFUL!!!
Open Database(
"yourDSNconnectionString",
"DROP TABLE dbo.yourTable"
);
// This will upload the table "dt = Current Data Table" to the database, where it will be saved as "yourTable".
dt << Save Database("yourDSNconnectionString",
"dbo.yourTable"
);
// After saving the table to the database, we find the column "SecondsSince1904" formatted as FLOAT.
// Now we want to manipulate the table "yourTable" and add a computed column named "timestamp", where we will display the correct timestamp,
// i. e. something like "2015-09-26 00:00:02.000".
// We do this by calculating the correct timestamp from the column "SecondsSince1904". We also add an additional column named "SecondsAfterMidnight" just for fun.
dbc = Create Database Connection(
"yourDSNconnectionString"
);
Execute SQL(dbc,
"
ALTER TABLE dbo.yourTable ADD timestamp AS
DATEADD(ss, (CAST(yourTable.SecondsSince1904 AS BIGINT)%86400),
DATEADD(dd, (CAST(yourTable.SecondsSince1904 AS BIGINT)/86400), '1904-01-01' ) );
ALTER TABLE dbo.yourTable ADD SecondsAfterMidnight AS
(CAST(yourTable.SecondsSince1904 AS BIGINT)%86400)
"
);
Close Database Connection(dbc);
Hasta ahora, todo bien. No hay problema hasta este momento. Los "SecondsAfter1904" se transfieren correctamente a la base de datos y la marca de tiempo también se calcula correctamente. Eche un vistazo a la base de datos:

Ahora consultamos la base de datos y recuperamos la tabla nuevamente en JMP yendo a Archivo > Base de datos > Abrir tabla. Y este es el punto donde las cosas se complican. Eche un vistazo en JMP:

La marca de tiempo está corrupta. Se produjo algún error. Quizás un bitshift o algo así. Para sacar conclusiones, incrementé SecondsSince1904 "bit a bit".
¿Alguien sabe qué pasó aquí? ¿Es esto un error? Se agradece cualquier ayuda.
Salud,
Víctor
Re: Consulta MS SQL con datos de marca de tiempo/fechahora/fecha<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Gracias msharp. Probaré su sugerencia con el comando TRUNCAR e INSERTAR EN una tabla existente. Pero actualmente no sé cómo especificar correctamente de qué tabla de datos en JMP se deben tomar los datos. Tal vez su útil contribución en este hilo me llevará a una solución...
Sin embargo, pude resolver el problema original usando datetime2(0) en la base de datos, como lo describo a continuación.
Re: Consulta MS SQL con datos de marca de tiempo/fechahora/fechaFinalmente resultó que debe haber un problema de conversión dentro de la base de datos cuando se inicia una consulta. Intento explicar esto:
Supongamos que algunas marcas de tiempo se almacenan en formato "fecha y hora" en una base de datos. Cuando ejecuto una consulta, las marcas de tiempo se vuelven erróneas al momento de la transferencia, como en el ejemplo anterior. Lo mismo sucede cuando las marcas de tiempo se almacenan en el formato "datetime2", que por defecto es "datetime2(7)".
Sin embargo, si lanzo una columna en la base de datos, digamos "datetime2(7)" a "smalldatetime", Me sale el mismo error. Por lo tanto, especulo que el problema no está dentro de JMP, sino dentro de la base de datos. Creo que JMP está enviando algún comando CAST o CONVERT a la columna con las marcas de tiempo antes de descargarlas. Y supongo que este es el momento donde ocurre el problema.
Para solucionar este problema, es posible CONVERTIR la columna con las marcas de tiempo al tipo " fechahora2(0) " formato. Este es el formato que JMP lee correctamente.
Aquí está el código completo:
Names Default To Here(1);
dt = Current Data Table();
dt << Save Database("yourDSNconnectionString",
"dbo.yourTable"
);
dbc = Create Database Connection(
"yourDSNconnectionString"
);
Execute SQL(dbc, // Here we calculate the correct timestamp/date from the Macintosh or JMP epoche (01.01.1904 00:00:00)
"
ALTER TABLE dbo.yourTable ADD timestamp AS
DATEADD(ss, (CAST(yourTable.SecondsSince1904 AS BIGINT)%86400),
DATEADD(dd, (CAST(yourTable.SecondsSince1904 AS BIGINT)/86400), '1904-01-01 00:00:00' ) );
"
);
Execute SQL(dbc,
"
ALTER TABLE dbo.yourTable ADD Date datetime2(0);
"
);
Execute SQL(dbc,
"
UPDATE dbo.yourTable
SET Date = CONVERT(datetime2(0), timestamp);
"
);
Execute SQL(dbc,
"
ALTER TABLE dbo.yourTable DROP COLUMN timestamp, SecondsSince1904
"
);
Close Database Connection(dbc);
Quizás esto sea útil para alguien.
Re: Consulta MS SQL con datos de marca de tiempo/fechahora/fechaTe falta entender.Guarde la fecha en la base de datos en formato DateTime.Lo que sugiere PMroz es convertir todo en cadenas de fechas antes de enviarlas a una plataforma diferente.Este es un consejo útil cuando se trata de diferentes épocas.
Tiene problemas para pasar de JMP a SQL Server porque elimina la tabla de datos.Simplemente debes borrarlo con "TRUNCATE TABLE table_name".No hay una columna de fecha/hora en JMP, solo son columnas numéricas con formato de fecha y hora.Como tal, cuando usa << Guardar base de datos, JMP simplemente crea una columna numérica ya que no tiene en cuenta el tiempo.Sin embargo, si ya tiene una tabla SQL con una columna formateada como fecha y hora y la inserta, entonces debería estar bien.
Re: Consulta MS SQL con datos de marca de tiempo/fechahora/fechaAunque es una conjetura, creo que tienes razón. Realmente parece que cada segundo suma 1000 segundos. Además, el reinicio se produce entre 23 y 123 segundos. Me imagino que el problema es que el formato de fecha y hora en SQL presenta mili, micro y nanosegundos (dd.mm.yyyy hh:mm:ss.mmmmmmn). Continuando con la especulación, podría ser que al importar desde la base de datos a JMP, JMP piense que 1000 milisegundos son 1000 segundos en lugar de 1 segundo.
Jugué con algunos formatos y estilos pero no pude enseñarle a JMP cómo importar la tabla desde la base de datos correctamente. Aquí está mi código más reciente, que asegura que el formato de marca de tiempo en la base de datos sea el mismo que en JMP. El formato se llama "smalldatetime" y se parece a "dd.mm.yyyy hh:mm:ss".
...
Ejecutar SQL(dbc,
"
ALTERAR TABLA dbo.berstTry01 AGREGAR marca de tiempo COMO
DATEADD(ss, (CAST(berstTry01.SecondsSince1904 AS BIGINT)%86400), CAST(
DATEADD(dd, (CAST(berstTry01.SecondsSince1904 AS BIGINT)/86400), '1904-01-01 00:00:00' ) AS smalldatetime) );
ALTER TABLE dbo.berstTry01 AGREGAR SegundosDespués de la medianoche AS
(CAST(berstTry01.SecondsSince1904 AS BIGINT)%86400);
"
);
...
Desafortunadamente esto tampoco funcionó. Y ahora mismo no tengo ni idea de qué hacer para que funcione.
La fórmula aplicada en la base de datos en realidad no interactúa en absoluto con JMP. Y el cálculo es evidentemente correcto, como se desprende de la primera imagen. Lo que está sucediendo es que se transfiere un INTEGER a la base de datos y los valores del INTEGER resultan ser los segundos transcurridos desde la "época JMP" (segundos desde 1904).
Si ejecuto su ejemplo, obtengo la fecha correcta, pero la hora incorrecta (18:07:17 en lugar de 14:14:14)...
Cuanto más investigo este problema, más tengo la sensación de que en realidad se trata de un error. Estoy ejecutando JMP 12.2.0.
Re: Consulta MS SQL con datos de marca de tiempo/fechahora/fechaBueno, hacer lo que sugeriste (tener las fechas en la base de datos como una cadena) fue una de las opciones que consideré. Pero pensé que sería conveniente tener las fechas en la base de datos almacenadas en formato de fecha y hora. Sin embargo, si guardo la tabla JMP en la base de datos, las fechas se almacenan como una cadena con formato char. Entonces no necesito CONVERTIR de fecha y hora a carácter y no sé por qué las fechas no se almacenan en el formato de fecha y hora en la base de datos de forma predeterminada. Por eso escribí el guión anterior...
Supongo que también terminaré con su solución, es decir, tener las fechas en la base de datos como cadenas formateadas en caracteres. Pero eso es un poco decepcionante para mí.
Re: Consulta MS SQL con datos de marca de tiempo/fechahora/fechaEsto es una conjetura, pero parece que cada segundo suma 1000 segundos.Luego, después de 86,4 segundos, se restablece a 0.Parece haber un problema con la forma en que la fórmula interactúa con JMP cuando se extrae.
¿Está utilizando la época JMP cuando inserta en SQL?SQL es 1-1-1900. Podría ser la razón por la que tiene problemas para insertar correctamente en SQL.
diferencia = número ( "1-1-1904" ) - número ( "1-1-1900" );
tiempo = ( número ( "14-7-1914 14:14:14" ) + diferencia)/ 86400 ;
//En SQL
base de datos = Crear conexión de base de datos ( "CONDUCTOR=SERVIDOR SQL;SERVIDOR=BLAH\SQLEXPRESS;Base de datos=Test_DB" );
Ejecutar SQL (db,
"SELECCIONAR REPARTO(" || carbonizarse (hora)|| "COMO DATETIME) COMO 'marca de tiempo'"
);
cerrar la conexión a la base de datos (db);
Esto me devuelve el valor correcto.
Re: Consulta MS SQL con datos de marca de tiempo/fechahora/fechaAdopto un enfoque ligeramente diferente para las fechas/horas cuando leo desde una base de datos.Los convierto en una cadena de caracteres y luego, una vez que estoy en JMP, los vuelvo a convertir a fecha o fecha y hora.De esa manera sé que será correcto.Estoy usando to_char en Oráculo.Veo que SQL Server usa CONVERTIR o ELENCO hacer algo parecido.Tengo funciones en JMP que convierten mis fechas de cadena en fechas JMP.
En el otro sentido (JMP a SQL Server), no estoy seguro de por qué tienes ese problema.¿Vale la pena investigar el formato de fecha predeterminado en SQL Server?