帶有時間戳/日期時間/日期資料的 MS SQL 查詢大家好,
我們想要將資料表儲存到資料庫中,然後查詢資料庫(使用 MS SQL)來檢索該表。 由於我們在將時間戳傳輸到資料庫時遇到一些問題,因此我們設定了一個解決方法。 首先,JMP 中的表有一個名為「SecondsSince1904」的「日期」列,其中日期時間儲存為自 1904 年紀元 (01.01.1904 00:00:00) 以來經過的秒數。 該列的格式為「固定小數點 (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 。
有誰知道這裡發生了什麼事? 這是一個錯誤嗎? 任何幫助表示讚賞。
乾杯,
勝利者
回覆:帶有時間戳/日期時間/日期資料的 MS SQL 查詢<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />謝謝你。 我將使用 TRUNCATE 命令嘗試您的建議並插入現有表。 但我目前不知道如何正確指定應從 JMP 中的哪個資料表中取得資料。 也許您的有益貢獻這個線程將引導我找到解決方案...
但是,我能夠透過使用資料庫中的 datetime2(0) 解決原始問題,如下所述。
回覆:帶有時間戳/日期時間/日期資料的 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);
也許這對某人有幫助
回覆:帶有時間戳/日期時間/日期資料的 MS SQL 查詢你想念明白了。將日期以日期時間格式儲存在資料庫中。PMroz 建議將所有內容轉換為日期字串,然後再將其傳送到不同的平台。在處理不同的時代時,這是一個方便的技巧。
您在從 JMP 到 SQL Server 的過程中遇到問題,因為您刪除了資料表。您應該使用“TRUNCATE TABLE table_name”清除它。JMP 中沒有日期/時間列,它們只是格式為日期時間的數字列。因此,當您使用 << Save Database 時,JMP 僅會建立一個數字列,因為它不考慮時間。但是,如果您已經有一個 SQL 表,其中有一列格式化為日期時間並插入其中,那麼應該沒問題。
回覆:帶有時間戳/日期時間/日期資料的 MS SQL 查詢雖然是猜測,但我認為你是對的。 真的好像每一秒都增加了 1000 秒。 此外,重置發生在 23 到 123 秒之間。 我可以想像,問題在於 SQL 中的日期時間格式具有毫秒、微秒和奈秒 (dd.mm.yyyy hh:mm:ss.mmmmmmn)。 繼續猜測,可能是從資料庫匯入 JMP 時,JMP 認為 1000 毫秒是 1000 秒,而不是 1 秒。
我嘗試過幾種格式和樣式,但無法教 JMP 如何正確從資料庫匯入表格。 這是我的最新程式碼,它確保資料庫中的時間戳格式與 JMP 中的相同。 該格式稱為“smalldatetime”,看起來像“dd.mm.yyyy hh:mm:ss”。
……
執行SQL(dbc,
」
ALTER TABLE dbo.berstTry01 新增時間戳 AS
DATEADD(ss, (CAST(berstTry01.SecondsSince1904 AS BIGINT)%86400), CAST(
DATEADD(dd, (CAST(berstTry01.SecondsSince1904 AS BIGINT)/86400), '1904-01-01 00:00:00' ) ASsmalldatetime) ) ;
更改表格 dbo.berstTry01 新增 SecondsAfterMidnight AS
(CAST(berstTry01.SecondsSince1904 AS BIGINT)%86400);
」
);
……
不幸的是這也不起作用。 現在我不知道該怎麼做才能讓它發揮作用
資料庫中應用的公式其實根本不與JMP互動。 而且計算顯然是正確的,從第一張圖就可以推斷出來。 發生的情況是,一個 INTEGER 被傳輸到資料庫,而 INTEGER 的值恰好是自「JMP 紀元」以來經過的秒數(自 1904 年以來的秒數)。
如果我運行你的範例,我會得到正確的日期,但時間錯誤(18:07:17 而不是 14:14:14)...
我對這個問題調查得越多,我就越覺得這實際上是一個錯誤。 我正在運行 JMP 12.2.0。
回覆:帶有時間戳/日期時間/日期資料的 MS SQL 查詢好吧,按照您的建議進行操作(將資料庫中的日期作為字串)是我考慮的選項之一。 但我認為以日期時間格式儲存資料庫中的日期會很方便。 但是,如果我將 JMP 表儲存到資料庫,日期將儲存為 char 格式的字串。 所以我不需要從日期時間轉換為字符,我不知道為什麼預設日期不以日期時間格式儲存在資料庫中。 這就是為什麼我寫了上面的腳本...
我想我最終也會得到你的解決方案,即將資料庫中的日期作為字元格式的字串。 但這讓我有點失望。
回覆:帶有時間戳/日期時間/日期資料的 MS SQL 查詢這是推測,但看起來每一秒都增加了 1000 秒。然後 86.4 秒後重設為 0。這似乎是公式在拉動時與 JMP 互動的方式有問題。
插入 SQL 時是否使用 JMP 紀元?SQL 是 1-1-1900。可能是您無法正確插入 SQL 的原因。
差異=編號( “1904 年 1 月 1 日” )--編號( “1900 年 1 月 1 日” );
時間=(編號( “1914 年 7 月 14 日 14:14:14” ) + 差異)/ 86400 ;
//在SQL中
分貝=建立資料庫連接( “驅動程式=SQL SERVER;伺服器=BLAH\SQLEXPRESS;資料庫=Test_DB” );
執行SQL (D b,
“選擇演員表(” ||字元(時間)|| “作為日期時間)作為‘時間戳’”
);
關閉資料庫連接(D b);
這為我返回了正確的值。
回覆:帶有時間戳/日期時間/日期資料的 MS SQL 查詢從資料庫讀取資料時,我對日期/日期時間採取了稍微不同的方法。我將它們轉換為字串,然後進入 JMP 後將其轉換回日期或日期時間。這樣我就知道它是正確的。我在用著到_char在甲骨文中。我看到 SQL Server 使用轉變或者投擲做類似的事情。JMP 中的函數可以將字串日期轉換為 JMP 日期。
走另一條路(JMP 到 SQL Server)我不確定為什麼你會遇到這個問題。SQL Server 中的預設日期格式是否值得研究?