2016-10-26 4 views
0

org.xerial:sqlite-jdbc:3.14.2.1を使って、Java 1.8のMacでSQLliteのdbを読み込もうとしています。特に、私は日付を読むことを試みているが、私は奇妙な結果を得る。詳細は以下をご覧ください。JDBCを介したSQLliteのREAL日付のdatetime(...)が不正確な範囲外の結果を返すのはなぜですか?

日付/時刻を表すタイプREALのフィールドを除いてすべてが正常に動作します。 SQLliteは、日付の特定のタイプを持っていないことに注意してくださいので、彼らはどちらか

  • StringYYYY-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.0732016-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のようなアプリケーションでファイルにアクセスすると、同じ番号が表示されるので、問題はエンコード自体にあると思います。

+1

は、彼らが見えるか見ます現在の日付? –

+0

すべてのデータを指定するわけではありません。質問を編集して正確な値を入力し、入力、出力、および期待値を表示します。変換を実行する正確なSQLを表示します。 –

+0

@BasilBourqueはMWEとそれを実行するための指示を追加しました。ありがとう! –

答えて

1

ここで問題となっているのは、サファリは標準のSQLite REAL datetime形式でvisit_timeの値を格納していないようです。代わりに、2001-01-01 00:00:00 UTCを基準に秒単位で値を格納します。詳細については、すなわち、約2.5E + 6合理ため、あなたがテーブルから数値を返すために、 `のResultSet#getFloat`を使用している場合、彼らは右の球場にいるような

What format is the Safari History.db history_visits.visit_time in?

+0

ありがとう皆さん! –

関連する問題