我有一个包含即将出生的数据库。该文件中有5条记录,截止日期为(11-15-2016,10-15-2016,12-14-2016,12-13-2016和02-12-2017) 查询是
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);'
howToFilter是
String howToFilter[]={ExpectedDateDue};
ExpectedDateDue是
ExpectedDateDue = new SimpleDateFormat("MM-dd-yyyy").format(new Date());
查询检索除2017年以外的所有记录,列表视图排序正确,就好像查询只记录月份在当月而不是整个日期之后的那些记录。 / p>
答案 0 :(得分:2)
SQLite中文本的比较运算符使用词典顺序。例如,这意味着def descendants_mapper(klass)
klass.subclasses.reduce({}){ |memo, subclass|
memo[subclass] = descendants_mapper(subclass); memo
}
end
{ MasterClass => descendants_mapper(MasterClass) }
"是小于 "01-01-2017
。 SQLite没有迹象表明这些字符串代表了应该按时间顺序进行比较的时刻。
一般情况下,我不喜欢在数据库中使用字符串作为时间戳,原因如下。我更喜欢将时间戳存储为表示自纪元以来的秒(或毫秒)的长值。以这种方式比较时间戳要容易得多,并且在SQLite或Java中转换到日期字符串和从日期字符串转换都很简单。
如果由于某种原因这不可行,那么我建议您改变将日期字符串存储在数据库中的方式。而不是"05-04-2016"
,请使用MM-dd-yyyy
。在这种格式中,词典比较将起作用;使用与以前相同的例子,yyyy-MM-dd
" 大于 "2017-01-01
。此外,如果您决定使用这种格式,则可以使用此格式作为SQLite各种date and time functions的输入。
如果您无法改变日期的存储方式,您需要以某种方式将它们转换为与您期望的格式相当的格式。您可以在查询中使用SQLite的"2016-05-04"
和substr()
(并置)函数将日期从||
转换为MM-dd-yyyy
格式。 this answer中的代码证明了这一点。