Query MS SQL con timestamp/datetime/dati dataCiao a tutti,
vogliamo salvare una tabella di dati in un database e successivamente interrogare il database (utilizzando MS SQL) per recuperare la tabella. Poiché riscontriamo alcuni problemi nel trasferimento del timestamp al database, abbiamo impostato una soluzione alternativa. Innanzitutto, la tabella in JMP ha una colonna "data" denominata "SecondsSince1904", dove la data/ora è memorizzata come secondi trascorsi dall'epoca del 1904 (01.01.1904 00:00:00). Questa colonna è formattata come "Fisso Dec (30,0)". Per trasferire la tabella dati nel database, utilizziamo il seguente 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);
Fin qui tutto bene. Nessun problema fino a questo punto. I "SecondsAfter1904" vengono trasferiti correttamente nel database e anche il timestamp viene calcolato correttamente. Dai un'occhiata al database:

Ora interroghiamo il database e recuperiamo la tabella in JMP andando su File > Database > Apri tabella. E questo è il punto in cui le cose si incasinano. Dai un'occhiata a JMP:

Il timestamp è danneggiato. Si è verificato un errore. Forse un bitshift o qualcosa del genere. Per trarre conclusioni, ho incrementato SecondsSince1904 "bitwise".
Qualcuno sa cosa è successo qui? è un insetto? Qualsiasi aiuto è apprezzato.
Saluti,
Vincitore
Ri: Query MS SQL con timestamp/datetime/dati data<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Grazie msharp. Proverò il tuo suggerimento con il comando TRUNCATE e INSERT INTO una tabella esistente. Ma al momento non so come specificare correttamente da quale tabella dati in JMP devono essere presi i dati. Forse il tuo utile contributo è arrivato questo filo mi porterà a una soluzione...
Tuttavia, sono riuscito a risolvere il problema originale utilizzando datetime2(0) nel database, come descritto di seguito.
Ri: Query MS SQL con timestamp/datetime/dati dataQuindi, alla fine, si è scoperto che doveva esserci un problema di conversione all'interno del database quando viene avviata una query. Provo a spiegare questo:
Supponiamo che alcuni timestamp siano archiviati nel formato "datetime" in un database. Quando quindi eseguo una query, i timestamp diventano errati durante il trasferimento, come nell'esempio sopra. Lo stesso accade quando i timestamp vengono archiviati nel formato "datetime2", che per impostazione predefinita è "datetime2(7)".
Tuttavia, se trasmetto una colonna nel database da, diciamo "datetime2(7)" a "smalldatetime", Ho fatto lo stesso errore. Pertanto suppongo che il problema non sia interno a JMP, ma all'interno del database. Penso che JMP stia inviando alcuni comandi CAST o CONVERT alla colonna con i timestamp prima di scaricarli. E immagino che questo sia il momento in cui si sta verificando il problema.
Per superare questo problema, è possibile CONVERTIRE la colonna con i timestamp in " dataora2(0) " formato. Questo è il formato che JMP legge correttamente.
Ecco il codice 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);
Forse questo è utile per qualcuno
Ri: Query MS SQL con timestamp/datetime/dati dataTi manca capire.Salvare la data nel database come formato DateTime.Ciò che PMroz suggerisce è di convertire tutto in stringhe di data prima di inviarle a una piattaforma diversa.Questo è un consiglio utile quando si ha a che fare con epoche diverse.
Stai riscontrando problemi nel passaggio da JMP a SQL Server perché elimini la tabella dei dati.Dovresti semplicemente cancellarlo con "TRUNCATE TABLE table_name".Non esiste una colonna data/ora in JMP, sono solo colonne numeriche formattate come data/ora.Pertanto, quando si utilizza << Salva database, JMP crea semplicemente una colonna numerica poiché non tiene conto del tempo.Tuttavia, se hai già una tabella SQL con una colonna formattata come data e ora e inserita al suo interno, dovresti stare bene.
Ri: Query MS SQL con timestamp/datetime/dati dataNonostante le congetture, penso che tu abbia ragione. Sembra davvero che ogni secondo aggiunga 1000 secondi. Anche il ripristino avviene tra 23 e 123 secondi. Potrei immaginare che il problema sia che il formato datetime in SQL presenta milli, micro e nanosecondi (gg.mm.aaaa hh:mm:ss.mmmmmmn). Continuando la speculazione, è possibile che durante l'importazione dal database a JMP, JMP pensi che 1000 millisecondi siano 1000 secondi anziché 1 secondo.
Ho giocato con alcuni formati e stili ma non sono riuscito a insegnare a JMP come importare correttamente la tabella dal database. Ecco il mio ultimo codice, che assicura che il formato del timestamp nel database sia lo stesso di JMP. Il formato si chiama "smalldatetime" e assomiglia a "gg.mm.aaaa hh:mm:ss".
...
Esegui SQL(dbc,
"
ALTERARE TABELLA dbo.berstTry01 AGGIUNGI timestamp AS
DATAADD(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 ADD SecondsAfterMidnight AS
(CAST(berstTry01.SecondsSince1904 COME BIGINT)%86400);
"
);
...
Sfortunatamente anche questo non ha funzionato. E in questo momento non ho più idea di cosa fare per farlo funzionare
La formula applicata nel database in realtà non interagisce affatto con JMP. E il calcolo è ovviamente corretto, come si può dedurre dalla prima immagine. Ciò che accade è che un INTEGER viene trasferito al database e i valori dell'INTEGER sembrano essere i secondi trascorsi dall'"epoca JMP" (secondi dal 1904).
Se eseguo il tuo esempio, ottengo la data corretta, ma un'ora sbagliata (18:07:17 invece di 14:14:14)...
Più indago su questo problema, più ho la sensazione che si tratti in realtà di un bug. Sto eseguendo JMP 12.2.0.
Ri: Query MS SQL con timestamp/datetime/dati dataBene, fare come hai suggerito (avere le date nel database come una stringa) è stata una delle opzioni che ho considerato. Ma ho pensato che sarebbe stato conveniente avere le date nel database archiviate nel formato datetime. Tuttavia, se salvo la tabella JMP nel database, le date vengono archiviate come una stringa formattata in carattere. Quindi non ho bisogno di CONVERTIRE da datetime a char e non so perché le date non sono archiviate nel formato datetime nel database per impostazione predefinita. Ecco perché ho scritto lo script sopra...
Immagino che alla fine otterrò anche la tua soluzione, ovvero avere le date nel database come stringhe formattate in char. Ma questo è un po' deludente per me.
Ri: Query MS SQL con timestamp/datetime/dati dataQuesta è una congettura, ma sembra che ogni secondo aggiunga 1000 secondi.Quindi dopo 86,4 secondi si reimposta su 0.Sembra che ci sia un problema con il modo in cui la formula interagisce con JMP quando viene estratta.
Stai utilizzando l'epoca JMP quando inserisci in SQL?L'SQL è 1-1-1900. Potrebbe essere il motivo per cui hai problemi a inserirli correttamente in SQL.
differenza = numero ( "1-1-1904" ) - numero ( "1-1-1900" );
tempo = ( numero ( "14-7-1914 14:14:14" ) + differenza)/ 86400 ;
//In SQL
db = Crea connessione al database ( "DRIVER=SERVER SQL;SERVER=BLAH\SQLEXPRESS;Database=DB_Test" );
Esegui SQL (db,
"SELEZIONA TRASMISSIONE(" || car (tempo)|| " AS DATETIME) AS 'timestamp'"
);
chiudere la connessione al database (db);
Questo restituisce il valore giusto per me.
Ri: Query MS SQL con timestamp/datetime/dati dataAdotto un approccio leggermente diverso alle date/datetime durante la lettura da un database.Li converto in una stringa di caratteri e poi, una volta entrato in JMP, li riconverto in data o data/ora.In questo modo so che sarà corretto.sto usando to_char nell'Oracolo.Vedo che SQL Server utilizza CONVERTIRE O LANCIO fare qualcosa di simile.Ho funzioni in JMP che convertono le mie date di stringa in date JMP.
Andando dall'altra parte (da JMP a SQL Server) non sono sicuro del motivo per cui stai riscontrando questo problema.Vale la pena esaminare il formato della data predefinito in SQL Server?