Requête MS SQL avec données d'horodatage/date/heure/dateBonjour à tous,
nous souhaitons enregistrer une table de données dans une base de données et interroger ultérieurement la base de données (à l'aide de MS SQL) pour récupérer la table. Étant donné que nous rencontrons des problèmes lors du transfert de l'horodatage vers la base de données, nous avons mis en place une solution de contournement. Tout d'abord, la table dans JMP comporte une colonne "date" nommée "SecondsSince1904", où la date/heure est stockée sous forme de secondes écoulées depuis l'époque 1904 (01.01.1904 00:00:00). Cette colonne est au format « Décembre fixe (30,0) ». Pour transférer la table de données vers la base de données, nous utilisons le script suivant :
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);
Jusqu'ici, tout va bien. Aucun problème jusqu'à présent. Les "SecondsAfter1904" sont correctement transférés dans la base de données et l'horodatage est également calculé correctement. Jetez un oeil dans la base de données :

Maintenant, nous interrogeons la base de données et récupérons la table dans JMP en allant dans Fichier > Base de données > Ouvrir la table. Et c’est à ce moment-là que les choses se gâtent. Jetez un œil dans JMP :

L'horodatage est corrompu. Une erreur s'est produite. Peut-être un bitshift ou quelque chose comme ça. Pour tirer des conclusions, j'ai incrémenté le SecondsSince1904 "au niveau du bit".
Est-ce que quelqu'un sait ce qui s'est passé ici ? Est-ce un bug ? Toute aide est appréciée.
Acclamations,
Victor
Re : Requête MS SQL avec données d'horodatage/date/heure/date<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Merci msharp. Je vais essayer votre suggestion avec la commande TRUNCATE et INSERT INTO une table existante. Mais je ne sais actuellement pas comment spécifier correctement de quelle table de données dans JMP les données doivent être extraites. Peut-être votre contribution utile dans ce fil va m'amener à une solution...
Cependant, j'ai pu résoudre le problème d'origine en utilisant datetime2(0) dans la base de données, comme je l'ai décrit ci-dessous.
Re : Requête MS SQL avec données d'horodatage/date/heure/dateFinalement, il s’est avéré qu’il devait y avoir un problème de conversion au sein de la base de données lorsqu’une requête était lancée. J'essaie d'expliquer ceci :
Supposons que certains horodatages soient stockés au format "datetime" dans une base de données. Lorsque j'exécute ensuite une requête, les horodatages deviennent erronés lors du transfert, comme dans l'exemple ci-dessus. La même chose se produit lorsque les horodatages sont stockés au format « datetime2 », qui est par défaut « datetime2(7) ».
Cependant, si je convertis une colonne dans la base de données, disons "datetime2(7)" en "smalldatetime", J'ai la même erreur. Par conséquent, je suppose que le problème ne vient pas de JMP, mais de la base de données. Je pense que JMP envoie une commande CAST ou CONVERT à la colonne avec les horodatages avant de les télécharger. Et je suppose que c'est à ce moment-là que le problème se produit.
Pour résoudre ce problème, il est possible de CONVERTIR la colonne avec les horodatages en " dateheure2(0) "format. C'est le format que JMP lit correctement.
Voici le code complet :
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);
Peut-être que c'est utile pour quelqu'un
Re : Requête MS SQL avec données d'horodatage/date/heure/dateVous manquez de comprendre.Enregistrez la date dans la base de données au format DateTime.Ce que PMroz suggère, c'est de tout convertir en chaînes de date avant de les envoyer vers une autre plateforme.C’est un conseil pratique lorsqu’il s’agit de différentes époques.
Vous rencontrez des problèmes pour passer de JMP à SQL Server car vous supprimez la table de données.Vous devez simplement l'effacer avec "TRUNCATE TABLE table_name".Il n'y a pas de colonne date/heure dans JMP, ce sont uniquement des colonnes numériques formatées en datetime.Ainsi, lorsque vous utilisez << Enregistrer la base de données, JMP crée simplement une colonne numérique car il ne tient pas compte du temps.Cependant, si vous avez déjà une table SQL avec une colonne formatée en datetime et que vous l'insérez, tout devrait bien se passer.
Re : Requête MS SQL avec données d'horodatage/date/heure/dateBien que conjecture, je pense que vous avez raison. Il semble vraiment que chaque seconde ajoute 1000 secondes. La réinitialisation se produit également entre 23 et 123 secondes. Je pourrais imaginer que le problème est que le format datetime dans SQL comporte des milli, micro et nanosecondes (jj.mm.aaaa hh:mm:ss.mmmmmmn). Poursuivant la spéculation, il se pourrait que lors de l'importation de la base de données vers JMP, JMP pense que 1 000 millisecondes équivalent à 1 000 secondes au lieu de 1 seconde.
J'ai joué avec quelques formats et styles, mais je n'ai pas pu apprendre à JMP comment importer correctement la table de la base de données. Voici mon dernier code, qui garantit que le format d'horodatage dans la base de données est le même que dans JMP. Le format s'appelle « smalldatetime » et ressemble à « jj.mm.aaaa hh:mm:ss ».
...
Exécuter SQL(dbc,
"
ALTER TABLE dbo.berstTry01 AJOUTER l'horodatage AS
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 AJOUTER SecondsAfterMidnight AS
(CAST(berstTry01.SecondsSince1904 AS BIGINT)%86400);
"
);
...
Malheureusement, cela n'a pas fonctionné non plus. Et pour le moment, je ne sais plus quoi faire pour que ça marche
La formule appliquée dans la base de données n’interagit en réalité pas du tout avec JMP. Et le calcul est évidemment correct, comme on peut le déduire de la première image. Ce qui se passe, c'est qu'un INTEGER est transféré à la base de données et que les valeurs de INTEGER se trouvent être les secondes écoulées depuis "l'époque JMP" (secondes depuis 1904).
Si j'exécute votre exemple, j'obtiens la bonne date, mais une mauvaise heure (18:07:17 au lieu de 14:14:14)...
Plus j'étudie ce problème, plus j'ai le sentiment qu'il s'agit en fait d'un bug. J'utilise JMP 12.2.0.
Re : Requête MS SQL avec données d'horodatage/date/heure/dateEh bien, faire comme vous l'avez suggéré (avoir les dates dans la base de données sous forme de chaîne) était l'une des options que j'ai envisagées. Mais j'ai pensé qu'il serait pratique de stocker les dates de la base de données au format datetime. Cependant, si j'enregistre la table JMP dans la base de données, les dates sont stockées sous forme de chaîne formatée en caractères. Je n'ai donc pas besoin de CONVERTIR de datetime en char et je ne sais pas pourquoi les dates ne sont pas stockées au format datetime dans la base de données par défaut. C'est pourquoi j'ai écrit le script ci-dessus...
Je suppose que je finirai également par adopter votre solution, c'est-à-dire avoir les dates dans la base de données sous forme de chaînes formatées en caractères. Mais c'est un peu décevant pour moi.
Re : Requête MS SQL avec données d'horodatage/date/heure/dateC'est une conjecture, mais il semble que chaque seconde ajoute 1 000 secondes.Puis après 86,4 secondes, il revient à 0.Cela semble être un problème avec la façon dont la formule interagit avec JMP lorsqu'elle est extraite.
Utilisez-vous l'époque JMP lorsque vous insérez dans SQL ?SQL est 1-1-1900. C'est peut-être la raison pour laquelle vous rencontrez des difficultés pour vous insérer correctement dans SQL.
différence = num ( "1-1-1904" ) - num ( "1-1-1900" );
temps = ( num ( "14/07/1914 14:14:14" ) + diff)/ 86400 ;
//En SQL
db = Créer une connexion à la base de données ( "DRIVER=SQL SERVER;SERVER=BLAH\SQLEXPRESS;Base de données=Test_DB" );
Exécuter SQL (base de données,
"SÉLECTIONNER LA DIFFUSION(" || carboniser (heure)|| "AS DATETIME) AS 'horodatage'"
);
fermer la connexion à la base de données (db);
Cela renvoie la bonne valeur pour moi.
Re : Requête MS SQL avec données d'horodatage/date/heure/dateJ'adopte une approche légèrement différente des dates/dates-heures lors de la lecture à partir d'une base de données.Je les convertis en chaîne de caractères, puis une fois dans JMP, je les reconvertis en date ou en datetime.De cette façon, je sais que ce sera correct.j'utilise to_char dans Oracle.Je vois que SQL Server utilise CONVERTIR ou CASTING faire quelque chose de similaire.J'ai des fonctions dans JMP qui convertissent mes dates de chaîne en dates JMP.
Dans l'autre sens (JMP vers SQL Server), je ne sais pas pourquoi vous rencontrez ce problème.Le format de date par défaut dans SQL Server mérite-t-il d'être étudié ?