Android 如何查询SQLite数据库以返回以毫秒形式插入的两个特定日期/时间之间的所有日期/时间?

Android 如何查询SQLite数据库以返回以毫秒形式插入的两个特定日期/时间之间的所有日期/时间?,android,sqlite,datetime,milliseconds,Android,Sqlite,Datetime,Milliseconds,我有一个包含4列的SQLite数据库。我使用“System.currentTimeMillis()”方法在列_date中插入了一个日期/时间值,以毫秒表示,我想查询SQLite数据库,以获取两个特定日期之间的所有行(也以毫秒表示)。 此查询还必须包括具有这两个特定日期的行 这是我的SQLite数据库: public static final String CREATE_SQL = "create table " + TABLE_NAME + "(" + COLUMN_ID + " integer

我有一个包含4列的SQLite数据库。我使用“System.currentTimeMillis()”方法在列_date中插入了一个日期/时间值,以毫秒表示,我想查询SQLite数据库,以获取两个特定日期之间的所有行(也以毫秒表示)。 此查询还必须包括具有这两个特定日期的行

这是我的SQLite数据库:

public static final String CREATE_SQL = "create table " + TABLE_NAME + "(" + COLUMN_ID + " integer primary key autoincrement, " +
        COLUMN_DATE + " integer not null, " + COLUMN_STATUS + " text not null, " + COLUMN_TOTAL + " text not null);";
这是带有插入值的数据库:

我希望以1578530800000(ID=2)作为开始日期,以157869820000(ID=5)作为结束日期来查询SQLite数据库,并获取这些特定日期之间的所有行,包括这些日期本身。 意味着我希望表作为结果标记为红色矩形

我试图查询数据库,但从未得到我期望的结果。 以下是我的查询示例:

String[] projection = {Wdatabase.COLUMN_ID, Wdatabase.COLUMN_DATE, Wdatabase.COLUMN_STATUS, Wdatabase.COLUMN_TOTAL};
String selection = Wdatabase.COLUMN_DATE + " >= " + startDate + " AND " + Wdatabase.COLUMN_DATE +" <= " + endDate;

Cursor r = Objects.requireNonNull(getActivity()).getContentResolver().query(DbProvider.CONTENT_URI, projection, selection, null, null, null);

你的问题是错误的。您应该将变量放在query()方法中,而不是第一个null,而不是放在selection参数中

根据您的意见,2020年1月9日星期四00:00:00(157852440000)至2020年1月10日星期五00:00:00

那么您就不会期望得到ID 5,因为那是2020年1月10日星期五23:16:42,这是同一个日期,但要晚一点

因此,如果您想获得从日期到日期的所有行,忽略时间,那么您可以使用等同于:-

SELECT COLUMN_ID,COLUMN_DATE,COLUMN_STATUS,COLUMN_TOTAL FROM thetable WHERE date(COLUMN_DATE / 1000,'unixepoch') BETWEEN date(1578530800000 / 1000,'unixepoch') AND  date(1578697200000 / 1000,'unixepoch');
所以

或(如建议的那样)

  • 因此,参数是有界的(即WHERE子句中的每一个?都安全地替换为1/1的值)
  • 注意使用BEWTEEN这稍微简化了查询,因为它只需要指定一次列
  • 如果你想按分钟而不是按天计算,可以使用datetime而不是date(发生3次)。基本上/1000正在下降毫秒
  • 注:以上为原则性代码,尚未运行或测试,因此可能包含一些错误。表示原始SQL已使用
:-

其结果是:-

COLUMN_ID   COLUMN_DATE COLUMN_STATUS   COLUMN_TOTAL    datetime(COLUMN_DATE / 1000,'unixepoch')
2   1578530800000   exit    1   2020-01-09 00:46:40
3   1578611801022   enter   2   2020-01-09 23:16:41
4   1578697200000   enter   3   2020-01-10 23:00:00
5   1578698202000   exit    1   2020-01-10 23:16:42

您为
startDate
endDate
传递什么值?作为startDate和endDate,我以毫秒为单位将dateTime传递为“1578530800000”,您如何使用r?编辑你的问题以显示,并请准确解释我所期望的意思,但从未得到。也许可以添加行
DatabaseUtils.dumpCursor(r)
,然后运行然后编辑您的问题以显示日志中的转储(如果有)。日志的结果是什么?在startDate和endDate变量中,我将日期时间设置为毫秒,但从TimeSquare日历选择器开始,每天从00:00:00开始,所以我认为我的逻辑中有一个错误,不是在代码中。是的,但不是真正的答案。
String selection = "date(" +Wdatabase.COLUMN_DATE + "/ 1000,'unixepoch') BETWEEN date(" + startDate + "/1000,'unixepoch') AND "date(" + endDate + "/1000,'unixepoch')";
String selection = "date(" +Wdatabase.COLUMN_DATE + "/ 1000,'unixepoch') BETWEEN date(?/1000,'unixepoch') AND date(?/1000,'unixepoch')";
Cursor r = Objects.requireNonNull(getActivity()).getContentResolver().query(DbProvider.CONTENT_URI, projection, selection, new String[]{String.valueOf(startDate),String.valueOf(endDate)}, null, null);
DROP TABLE IF EXISTS thetable;
create table thetable (COLUMN_ID integer primary key autoincrement, COLUMN_DATE integer not null, COLUMN_STATUS text not null, COLUMN_TOTAL text not null);
INSERT INTO thetable (COLUMN_DATE,COLUMN_STATUS,COLUMN_TOTAL) VALUES
    (1578524400000,'enter',0),
    (1578530800000,'exit',1),
    (1578611801022,'enter',2),
    (1578697200000,'enter',3),
    (1578698202000,'exit',1),
    (1578783710000,'enter',2);

SELECT COLUMN_ID,COLUMN_DATE,COLUMN_STATUS,COLUMN_TOTAL, datetime(COLUMN_DATE / 1000,'unixepoch') FROM thetable WHERE date(COLUMN_DATE / 1000,'unixepoch') BETWEEN date(1578530800000 / 1000,'unixepoch') AND  date(1578697200000 / 1000,'unixepoch');
DROP TABLE IF EXISTS thetable;
COLUMN_ID   COLUMN_DATE COLUMN_STATUS   COLUMN_TOTAL    datetime(COLUMN_DATE / 1000,'unixepoch')
2   1578530800000   exit    1   2020-01-09 00:46:40
3   1578611801022   enter   2   2020-01-09 23:16:41
4   1578697200000   enter   3   2020-01-10 23:00:00
5   1578698202000   exit    1   2020-01-10 23:16:42