タイムスタンプ/日時/日付データを含むMS SQLクエリこんにちは、みんな、
データテーブルをデータベースに保存し、後で (MS SQL を使用して) データベースにクエリを実行してテーブルを取得したいと考えています。 タイムスタンプをデータベースに転送するときにいくつかの問題が発生したため、回避策を設定しました。 まず第一に、JMP のテーブルには「SecondsSince1904」という名前の「日付」列があり、日時は 1904 エポシュ (01.01.1904 00:00:00) からの経過秒数として格納されます。 この列の形式は「Fixed Dec (30,0)」です。 データテーブルをデータベースに転送するには、次のスクリプトを使用します。
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);
ここまでは順調ですね。 ここまでは問題ありません。 「SecondsAfter1904」はデータベースに正しく転送され、タイムスタンプも正しく計算されます。 データベースを見てみましょう。

ここで、「ファイル」>「データベース」>「テーブルを開く」の順に選択して、データベースにクエリを実行し、テーブルを JMP に取得します。 そして、ここが事態が混乱するポイントです。 JMP を見てください。

タイムスタンプが壊れています。 何らかのエラーが発生しました。 もしかしたらビットシフトとかそのようなものかもしれません。 結論を引き出すために、SecondsSince1904 を「ビット単位」でインクリメントしました。
ここで何が起こったのか知っている人はいますか? これはバグですか? 助けていただければ幸いです。
乾杯、
ビクター
Re: タイムスタンプ/日時/日付データを使用した MS SQL クエリ<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />msharpさん、ありがとうございます。 TRUNCATEコマンドと既存のテーブルへのINSERT INTOを使用してあなたの提案を試してみます。 しかし、現時点では、JMPのどのデータテーブルからデータを取得するかを正しく指定する方法がわかりません。 おそらくあなたの役立つ貢献は、このスレッド解決策に導いてくれるでしょう…
ただし、以下で説明するように、データベース内の datetime2(0) を使用することで、元の問題を解決することができました。
Re: タイムスタンプ/日時/日付データを使用した MS SQL クエリそのため、クエリの開始時にデータベース内で変換の問題が発生するはずであることが最終的に判明しました。 私はこれを説明しようとします:
一部のタイムスタンプがデータベースに「日時」形式で保存されていると仮定します。 その後クエリを実行すると、上記の例のように、転送時にタイムスタンプが間違ってしまいます。 タイムスタンプが「datetime2」形式 (デフォルトでは「datetime2(7)」) で保存されている場合にも、同じことが発生します。
ただし、データベース内の列を「datetime2(7)」から「smalldatetime」にキャストすると、同じエラーが発生します。 したがって、問題は JMP 内ではなくデータベース内にあるのではないかと私は推測しています。 JMP はタイムスタンプをダウンロードする前に、タイムスタンプを含む列に CAST または CONVERT コマンドを送信しているのだと思います。 そして、これが問題が発生している瞬間だと思います。
この問題を解決するには、タイムスタンプを持つ列を「日時2(0) " フォーマット。 これは、JMP が正しく読み取る形式です。
完全なコードは次のとおりです。
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);
たぶんこれは誰かにとって役立つでしょう
Re: タイムスタンプ/日時/日付データを使用した MS SQL クエリあなたは理解できません。日付を DateTime 形式でデータベースに保存します。PMrozが提案しているのは、別のプラットフォームに送信する前に、すべてを日付文字列に変換することです。これは、さまざまなエポックを扱うときに役立つヒントです。
データテーブルを削除すると、JMP から SQL Server への接続に問題が発生します。「TRUNCATE TABLE table_name」でクリアするだけです。JMP には日付/時刻列はありません。日付/時刻としてフォーマットされた数値列だけです。そのため、<< Save Database を使用すると、JMP は時間を気にしないため、数値列を作成するだけです。ただし、日付時刻としてフォーマットされた列を含む SQL テーブルがすでにあり、そこに挿入する場合は問題ありません。
Re: タイムスタンプ/日時/日付データを使用した MS SQL クエリ推測ではありますが、あなたの言うことは正しいと思います。 本当に1秒ごとに1000秒ずつ増えていくような気がします。 また、リセットは 23 ~ 123 秒の間で発生します。 問題は、SQL の日時形式にミリ、マイクロ、ナノ秒 (dd.mm.yyyy hh:mm:ss.mmmmmmn) が含まれていることであると想像できます。 推測を続けると、データベースから JMP へのインポート時に、JMP は 1000 ミリ秒を 1 秒ではなく 1000 秒と認識している可能性があります。
いくつかのフォーマットとスタイルを試してみましたが、データベースからテーブルを正しくインポートする方法を JMP に教えることができませんでした。 これは私の最新のコードです。これは、データベース内のタイムスタンプ形式が JMP と同じであることを保証します。 この形式は「smalldatetime」と呼ばれ、「dd.mm.yyyy hh:mm:ss」のようになります。
...
SQLを実行(dbc,
」
ALTER TABLE dbo.berstTry01 ADD タイムスタンプ 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 ADD SecondsAfterMidnight AS
(CAST(berstTry01.SecondsSince1904 AS BIGINT)%86400);
」
);
...
残念ながら、これもうまくいきませんでした。 そして今、それを機能させるために何をすべきか、もう見当がつきません
データベースに適用される式は、実際には JMP とまったく対話しません。 最初の写真から推測できるように、計算は明らかに正しいです。 何が起こっているのかというと、INTEGER がデータベースに転送され、INTEGER の値がたまたま「JMP エポッシュ」からの経過秒数 (1904 年からの秒数) になるということです。
あなたの例を実行すると、正しい日付が得られますが、間違った時間(14:14:14ではなく18:07:17)が得られます...
この問題を調べれば調べるほど、これは実際にはバグではないかという気がしてきます。 JMP 12.2.0を実行しています。
Re: タイムスタンプ/日時/日付データを使用した MS SQL クエリまあ、あなたが提案したようにすること(データベース内の日付を文字列として持つ)は、私が検討したオプションの1つでした。 しかし、データベース内の日付を日時形式で保存すると便利だと思いました。 ただし、JMP テーブルをデータベースに保存すると、日付は char 形式の文字列として保存されます。 したがって、日時から文字に変換する必要はありません。また、日付がデフォルトでデータベースに日時形式で保存されない理由がわかりません。 そのため、上記のスクリプトを作成しました...
私もあなたの解決策、つまりデータベース内の日付を文字でフォーマットされた文字列として持つことになると思います。 しかし、それは私にとって少し残念です。
Re: タイムスタンプ/日時/日付データを使用した MS SQL クエリこれは推測ですが、1 秒ごとに 1000 秒ずつ加算されているように見えます。そして 86.4 秒後に 0 にリセットされます。これは、プル時に式が JMP と相互作用する方法に問題があるようです。
SQL に挿入するときに JMP エポックを使用していますか?SQL は 1-1-1900 です。 SQL に正しく挿入できないのは、それが原因である可能性があります。
差分 =番号( 「1904 年 1 月 1 日」 ) -番号( 「1-1-1900」 );
時間 = (番号( 「1914 年 7 月 14 日 14:14:14」 ) + 差分)/ 86400 ;
//SQLの場合
データベース =データベース接続の作成( "DRIVER=SQL SERVER;SERVER=BLAH\SQLEXPRESS;Database=Test_DB" );
SQLの実行(データベース、
"セレクトキャスト(" ||チャー(時間)|| " 日時として) 'タイムスタンプ' として"
);
データベース接続を閉じる(db);
これにより、私にとって正しい値が返されます。
Re: タイムスタンプ/日時/日付データを使用した MS SQL クエリデータベースから読み取るときは、日付/日時に対して少し異なるアプローチをとります。それらを文字列に変換し、JMP に入ったら日付または日時に変換し直します。そうすればそれが正しいことがわかります。使っていますto_charオラクルで。SQL Server が使用していることが分かりました変換するまたはキャスト似たようなことをするために。JMP には、文字列の日付を JMP の日付に変換する関数があります。
別の方法 (JMP から SQL Server) に進むと、なぜその問題が発生するのかわかりません。SQL Server のデフォルトの日付形式は調査する価値がありますか?