【问题标题】:Android: Save date normally to sqlite but sort by date considering month and dayAndroid:通常将日期保存到sqlite,但考虑月份和日期按日期排序
【发布时间】:2012-02-28 10:47:03
【问题描述】:

我看过很多关于存储日期的帖子。

我仍然没有得到将它保存到 sqlite 数据库的精细和精确的方法。

我可以存储它,但在排序过程中,我只需要考虑月份和日期,就像生日一样,年份无关紧要。

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

【问题讨论】:

  • 你是如何存储它的? Unix 纪元还是其他一些奇怪的格式?
  • 我将其存储为文本,但如何对其进行排序
  • 对。文本。那么您的文本使用什么格式
  • 我没有得到。我使用 TEXT 作为字符串 ("YYYY-MM-DD HH:MM:SS.SSS")。这里我这次不使用 HH:MM..... .我是对的还是应该寻求更好的方法.......实际上我被困住了如何继续。
  • 任何方式正常保存并相应排序

标签: android sqlite date


【解决方案1】:

您应该首先查看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 将返回您数据库中“重新定位”当前年份的日期和时间 - 当然,这可能会在闰年引入各种不稳定的行为。

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

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

【讨论】:

  • 排序时也会考虑年份。实际上我需要排序而不考虑年份
  • 是的,如果再过一年,事件就不会“提前两天”。如果您需要更改存储的日期和时间值,您可以使用 strfmttime 函数。
【解决方案2】:

如果您想按日和月排序,请考虑将日期存储为 ddMMyyyy 格式的字符串(日和月需要两位数,否则排序将有缺陷)。按递增值排序将为您提供按日和月(然后是年)排序的日期。

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多