Android:通常将日期保存到sqlite,但按日期排序,考虑月份和日期

时间:2012-02-28 10:47:04

标签: android sqlite date

我看过关于存储日期的帖子数量。

我仍然没有得到将其保存到sqlite数据库的精确而准确的方法。

我能够存储它,但在分类过程中,我只需要考虑月份和日期就像生日,而年份并不重要。

如果我想提前2或3天的日期行,如2月28日搜索的2月3日行,将会是什么查询?

3 个答案:

答案 0 :(得分:2)

您应该首先查看date & time functions的SQLite文档。

例如,要解决您的问题“如果我想获得其日期提前2或3天的行那将是什么样的查询”您将使用朱利安日计算,例如作为此示例,您可以直接在sqlite3 shell中执行:

create TABLE example (_id INTEGER PRIMARY KEY NOT NULL, date TEXT NOT NULL);
insert into example (date) values ('2011-01-02');
insert into example (date) values ('2011-04-02');
insert into example (date) values ('2012-02-26');
insert into example (date) values ('2012-02-27');
insert into example (date) values ('2012-02-28');
insert into example (date) values ('2012-02-29');
insert into example (date) values ('2012-03-01');
insert into example (date) values ('2012-03-02');
insert into example (date) values ('2012-03-03');
select date from example where julianday(date) - julianday('now') < 3 AND julianday(date) - julianday('now') > 0;

这将在未来的一天,两天或三天内返回(假设“今天”是2月28日):

2012-02-29
2012-03-01
2012-03-02

编辑:要仅返回行,无论年份如何,您都可以执行以下操作 - 使用VIEW(再次,例如,直接在SQLite中):

create view v_example as select _id, date,
    strftime("%Y", 'now')||'-'||strftime("%m-%d", date) as v_date from example;

VIEW会返回日期&amp;你的数据库中的时间在当年被“重新定位” - 这当然可以引入闰年的各种不稳定的行为。

在这种情况下,你可以选择这样的所有日期:

select date from v_example where 
    julianday(v_date) - julianday('now') < 3 AND
    julianday(v_date) - julianday('now') > 0 ORDER BY v_date;

哪会回来:

2012-02-29
2012-03-01
2001-03-01
2012-03-02
2010-03-02

答案 1 :(得分:1)

如果您想按日期和月份排序,请考虑将日期作为字符串以ddMMyyyy格式存储(日期和月份需要两位数字,否则排序将存在缺陷)。通过增加值进行排序将为您提供按日期和月份(以及年份)排序的日期。

您甚至可以使用字符串进行范围查询,但您必须计算查询字符串。

或者,您可以将日期作为毫秒存储在附加列中(这是数据库中日期的常用格式),并使用整数运算更轻松地执行范围查询。

答案 2 :(得分:0)

一种选择是在SQLite中使用strftime()去除年份,然后进行比较。

select * from sometable where strftime('%m-%d', somecolumn) = '02-28'

这将对2月28日的所有行进行查询。但是如果你有一个大表并且需要对每一行进行字符串转换以进行比较,性能可能会受到影响。如果经常执行此查询,可能会将日期和月份存储在另外两列中?