2

我是 Sqlite 的初学者,正在努力整理我需要的查询。:-( 任何人都可以帮助我吗?

我有一个给定的日期。在我下面的示例中,此变量称为“ givenDate ”,并且是 java 类型Date,因此格式为yyyy-MM-dd

我还有一个名为“main”的数据库表,其中包含一个“ID”“Date”列。日期列条目采用 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

DateDiff 在 Android 中不起作用,因为数据库是 Sqlite 数据库。

我试过做这样的事情:

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

这似乎不起作用。我只是得到与 givenDate 中的年份相同且按升序排列的日期列表。日期差异似乎并没有实际计算日期差异并给出最接近的 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 回答