Android 如何查询SQLite数据库以返回以毫秒形式插入的两个特定日期/时间之间的所有日期/时间?
我有一个包含4列的SQLite数据库。我使用“System.currentTimeMillis()”方法在列_date中插入了一个日期/时间值,以毫秒表示,我想查询SQLite数据库,以获取两个特定日期之间的所有行(也以毫秒表示)。 此查询还必须包括具有这两个特定日期的行 这是我的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
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