Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLite RawQuery不返回2017日期的记录_Android_Database_Sqlite - Fatal编程技术网

Android SQLite RawQuery不返回2017日期的记录

Android SQLite RawQuery不返回2017日期的记录,android,database,sqlite,Android,Database,Sqlite,我有一个包含即将出生的婴儿的数据库。该文件中有5条记录,到期日分别为(2016年11月15日、2016年10月15日、2016年12月14日、2016年12月13日和2017年2月12日) 问题是 SQLiteDatabase db = dbhelper.getReadableDatabase(); String QueryPart1="SELECT inseminations._ID, inseminations.patient_id, inseminations.date_d

我有一个包含即将出生的婴儿的数据库。该文件中有5条记录,到期日分别为(2016年11月15日、2016年10月15日、2016年12月14日、2016年12月13日和2017年2月12日) 问题是

SQLiteDatabase db = dbhelper.getReadableDatabase();
        String QueryPart1="SELECT inseminations._ID, inseminations.patient_id, inseminations.date_due ";
        String QueryPart2="FROM inseminations ";
        String QueryPart3="WHERE inseminations.date_due>=? ";
        String QueryPart4="ORDER BY inseminations.date_due ASC";
        String FinalQuery=QueryPart1+QueryPart2+QueryPart3+QueryPart4;
        mCursor = db.rawQuery(FinalQuery ,howToFilter);'
过滤器是什么

            String howToFilter[]={ExpectedDateDue};
预期的到期日是

        ExpectedDateDue = new SimpleDateFormat("MM-dd-yyyy").format(new Date());

该查询检索除2017年的记录外的所有记录,listview排序正确,就好像该查询只获取当月之后的记录,而不是整个日期。

SQLite中文本上的比较运算符使用字典顺序。例如,这意味着
“01-01-2017
”小于
“05-04-2016”
。SQLite没有迹象表明这些字符串表示应该按时间顺序进行比较的时刻

一般来说,出于这样的原因,我不喜欢在数据库中使用字符串作为时间戳。我更喜欢将时间戳存储为表示自epoch以来的秒(或毫秒)的长值。以这种方式比较时间戳要容易得多,并且在SQLite或Java中,日期字符串的转换非常简单

如果由于某种原因这不可行,那么我建议您改变在数据库中存储日期字符串的方式。使用
yyyy-MM-dd
,而不是
MM-dd-yyyy
。在这种格式中,词典比较将起作用;使用与前面相同的示例,
“2017-01-01
”大于
“2016-05-04”
。此外,如果您决定使用SQLite的各种格式,可以将其作为输入


如果您无法更改日期的存储方式,则需要以某种方式将其转换为与您期望的方式类似的格式。您可以在查询中使用SQLite的
substr()
| |
(连接)函数将日期从
MM dd yyyy
格式转换为
yyyy MM dd
格式。中的代码演示了这一点。

SQLite中文本上的比较运算符使用字典顺序。例如,这意味着
“01-01-2017
”小于
“05-04-2016”
。SQLite没有迹象表明这些字符串表示应该按时间顺序进行比较的时刻

一般来说,出于这样的原因,我不喜欢在数据库中使用字符串作为时间戳。我更喜欢将时间戳存储为表示自epoch以来的秒(或毫秒)的长值。以这种方式比较时间戳要容易得多,并且在SQLite或Java中,日期字符串的转换非常简单

如果由于某种原因这不可行,那么我建议您改变在数据库中存储日期字符串的方式。使用
yyyy-MM-dd
,而不是
MM-dd-yyyy
。在这种格式中,词典比较将起作用;使用与前面相同的示例,
“2017-01-01
”大于
“2016-05-04”
。此外,如果您决定使用SQLite的各种格式,可以将其作为输入


如果您无法更改日期的存储方式,则需要以某种方式将其转换为与您期望的方式类似的格式。您可以在查询中使用SQLite的
substr()
| |
(连接)函数将日期从
MM dd yyyy
格式转换为
yyyy MM dd
格式。中的代码演示了这一点。

当您将月份放在第一位时,值将按月份排序。对于yyyy-MM-dd格式,当我将格式更改为yyyy-MM-dd时,它将起作用。当您将月份放在第一位时,不会返回任何记录,这些值是按月份排序的。使用yyyy-MM-dd格式,当我将格式更改为yyyy-MM-dd时,它将起作用。不会返回任何记录。谢谢,我将尝试一下。谢谢,我将尝试一下