1

在数据库中,我以 3 列的形式保存了日期:Year、Month、Day_of_Month(我知道这可能不是保存日期的最佳方式,但我进行了某些其他适合这种格式的查询。)

现在我希望获取日期在两个指定日期之间的所有行。我经历了以前的 stackoverflow 问题,但大多数都将日期保存为单个实体。

这就是我尝试的方式:

我有一个 MySqLiteHelper 类,其中声明了所有列名。我也在那里创建表格。COLUMN_DATE_YEAR、COLUMN_DATE_MONTH 和 COLUMN_DATE_DAY 是存储列名的字符串。

      int fyear, fmonth, fday; // I populate those initial date values
      int tyear, tmonth, tday; // I populate those target date values

      String selection = MySQLiteHelper.COLUMN_DATE_YEAR + " >= '"+fyear+"' AND "+ MySQLiteHelper.COLUMN_DATE_DAY + " >= '"+fday+"' AND "
              + MySQLiteHelper.COLUMN_DATE_MONTH + " >= '"+fmonth+"' AND " + MySQLiteHelper.COLUMN_DATE_YEAR + " <= '"+tyear+"' AND "
              + MySQLiteHelper.COLUMN_DATE_DAY + " <= '"+ tday+"' AND "+ MySQLiteHelper.COLUMN_DATE_MONTH + " <= '"+tmonth+"'";

      String []column = {MySQLiteHelper.COLUMN_MOOD_LEVEL};
      Cursor cursor = database.query(MySQLiteHelper.TABLE_NAMES, column, selection, null, null, null, null);

现在,这种方法的问题在于,它不会为 2013 年 2 月 25 日至 2013 年 3 月 17 日之间的查询提供任何结果,因为日期为 25 日 > 17 日,即使月份 2 < 3 也是如此。这可能需要某种嵌套的 where 子句。但是我无法使用“.query”方法形成嵌套的“Where”。

请提出一种查询存储在这两个日期之间的条目的方法。提前致谢。

4

3 回答 3

2

没有理由不能运行更复杂的 WHERE 子句,如下所示(对于日期 >= 2013-02-17):

( YEAR > 2013 OR ( YEAR = 2013 AND ( MONTH > 2 OR ( MONTH = 2 AND DAY >= 17 ) ) ) )

这将起作用,但它是从最佳状态开始的。你最好纠正你的数据库设计。

更正:您必须修复您的数据库设计。将日期存储为DATE类型或 ISO 字符串:yyyy-mm-dd.

奖励:假设您现在拥有以下内容:

CREATE TABLE theTable( 
    ....
    THEYEAR TEXT,
    THEMONTH TEXT,
    THEDAY TEXT );

要将日期转换为可用格式,您只需运行以下命令:

ALTER TABLE theTable
  ADD COLUMN THEDATE TEXT;

UPDATE theTable
    SET THEDATE = THEYEAR || substr( '0' || '-' || THEMONTH, -2, 2 ) || '-' || substr( '0' || THEDAY, -2, 2 );

完成后,您可以使用该BETWEEN子句进行查询。

于 2013-03-17T15:24:00.527 回答
1

使用您当前的模式,尝试重新排序您的 WHERE 子句。您需要首先比较最大的列,即年、月、。对于您当前的年、、月,您无法准确比较跨入新月份的日期。
例如:day >= 25 和 day <= 17 创建一个无效范围。它没有考虑正确的范围:>25,换行到 1,然后 <17...

于 2013-03-17T15:36:34.693 回答
0

在不更改表结构的情况下,以下查询将为您工作,试试吧

select * from TableName WHERE (10000*ColumnYear+100*ColumnMonth+ColumnDay >= 20131009) and (10000*ColumnYear+100*ColumnMonth+ColumnDay <= 20131121);
于 2013-11-21T10:41:17.690 回答