org.xerial:sqlite-jdbc:3.14.2.1
を使って、Java 1.8のMacでSQLlite
のdbを読み込もうとしています。特に、私は日付を読むことを試みているが、私は奇妙な結果を得る。詳細は以下をご覧ください。JDBCを介したSQLliteのREAL日付のdatetime(...)が不正確な範囲外の結果を返すのはなぜですか?
日付/時刻を表すタイプREAL
のフィールドを除いてすべてが正常に動作します。 SQLlite
は、日付の特定のタイプを持っていないことに注意してくださいので、彼らはどちらか
String
(YYYY-MM-DD hh:mm:ss.sss
別名ISO-8601文字列のような形式で)、Integer
(すなわちとして格納されます。数(ユリウス暦の日数:グリューリック暦正午から4714年11月24日に紀元前に渡された紀元前4ヶ月のグレゴリオ暦に基づく)。
幸いにも、SQLlite
は、日付フィールドをデコードするdate(...)
またはtime(...)
のような機能を提供します。私の場合、datetime(...)
を使ってReal
をISO-8601文字列に変換しました。
は、例えば、私は、Real
に現在時刻(実際2016-10-26 18:37:24.073
と2016-10-26 18:37:24.856
)に変換し、バック私は次の値を得た:
1362040-16036186-28 02:43:37
1362040-16036186-29 17:38:02
注意ことをと月は間違っていて、 時刻が2番目の値が正しい。
(ただ、Safariの上の任意のサイトを参照してください、システムのダウンタイムを注意してサンプルコードを実行して)私は、次のコードを使用して、私が読んでいるファイルは、Safariの歴史です:
Connection connection = null;
try {
String filename = "/Users/stefano/Library/Safari/History.db";
connection = DriverManager.getConnection("jdbc:sqlite:" + filename);
Statement statement = connection.createStatement();
statement.setQueryTimeout(30);
TreeSet<String> values = new TreeSet<>(reverseOrder());
ResultSet results = statement.executeQuery(
"SELECT datetime(visit_time) AS value FROM history_visits;");
while (results.next()) {
String value = results.getString("value");
values.add(value);
}
System.out.println(values.first());
} catch (SQLException e) {
System.err.println(e.getMessage());
} finally {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
System.err.println(e.getMessage());
}
}
質問があります:これはなぜ起こるか知っていますか?予想されるタイムスタンプを取得するにはどうすればよいですか?ありがとうございます。
PS:DB Browser for SQLite
のようなアプリケーションでファイルにアクセスすると、同じ番号が表示されるので、問題はエンコード自体にあると思います。
は、彼らが見えるか見ます現在の日付? –
すべてのデータを指定するわけではありません。質問を編集して正確な値を入力し、入力、出力、および期待値を表示します。変換を実行する正確なSQLを表示します。 –
@BasilBourqueはMWEとそれを実行するための指示を追加しました。ありがとう! –