2

私はSqliteの初心者であり、必要なもののクエリをまとめるのに苦労しています。:-(誰か助けてくれませんか?

日付があります。以下の私の例では、この変数は「givenDate」と呼ばれ、JavaタイプはDateであるため、 yyyy-MM-ddの形式になっています。

また、 「ID 」列と「日付」列を持つ「main」というデータベーステーブルもあります。日付列のエントリは、ISO標準の文字列形式です。したがって、エントリは次のようになります。

ID   Date
001  1949-08-13 06:29:21.000
002  1943-08-13 10:13:45.000
003  1948-08-13 09:12:32.100
004  etc.

日付列を指定された日付「givenDate」と比較するときに、テーブル「main」から最も近い10個の日付のリストを取得する必要があります。

だから私はする必要があります:

  1. [日付]列の各日付を、指定した日付'givenDate'と比較します
  2. それらの間の絶対差を計算します
  3. 違いの小さいものから大きいものの順に並べてください
  4. 最小の10件の結果のそれぞれのIDと日付を返します

したがって、givenDateが1948-09-13の場合、結果は次のようになります。

003  1948-08-13 09:12:32.100
001  1949-08-13 06:29:21.000
002  1943-08-13 10:13:45.000
etc

データベースはSqliteデータベースであるため、DateDiffはAndroidでは機能しません。

私はこのようなことをしようとしました:

String query = 
"SELECT ID, Date" +
"FROM main" +
"WHERE Date IS NOT NULL" +
"ORDER BY ABS(date("+givenDate+") - Date) ASC" +
"LIMIT 10";

これはうまくいかないようです。与えられた日付の年と同じ年の日付のリストを昇順で取得します。日付の差は、実際には日付の差を計算して、最も近い10を与えるようには見えません。

たくさんの投稿を調べましたが、必要なことを行うための具体的なものが見つかりません。

どんな助けでも大歓迎です。

ありがとう、シミー:-)


答えは:

Format sqliteDateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 

String query2 = 
"SELECT _id, Date " + 
"FROM main " + 
"WHERE Date IS NOT NULL " + 
"ORDER BY ABS(JULIANDAY('" + sqliteDateFormatter.format(aDate) + "') - " + "JULIANDAY(Date)) " + 
"LIMIT 10";
4

1 に答える 1

0

ドキュメントによると、aを文字列に変換するだけDateでは、SQLiteが理解できない形式になります。正しい形式を明示的に使用する必要があります。

さらに、これらの日付値は単なる文字列であるため、単純に減算することはできません。最初にそれらを数値の日付形式に変換する必要があります。

Format sqliteDateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String query = ... +
    "ORDER BY ABS(JULIANDAY('" + sqliteDateFormatter.format(date) + "') - " +
                 "JULIANDAY(Date))" +
    ...
于 2012-11-12T08:26:25.300 に答える