【问题标题】:Room Database functions WEEK(), MONTH(), etc房间数据库函数 WEEK()、MONTH() 等
【发布时间】:2019-08-12 02:44:38
【问题描述】:

我有一个带有“条目”表的房间数据库,其中有 value(int)cat_id(int)date(Date) 列。

我想得到当月所有条目和当周所有条目的总和。但是选择:

@Query("SELECT sum(value) FROM Entry WHERE cat_id = :cat_id AND WEEK(date, 5) = WEEK(:date, 5) AND YEAR(date) == YEAR(:date)")
float getValueThisWeekByCatId(int cat_id, Date date);

@Query("SELECT sum(value) FROM Entry WHERE cat_id = :cat_id AND MONTH(date) = MONTH(:date) AND YEAR(date) == YEAR(:date)")
float getValueThisMonthByCatId(int cat_id, Date date);

不工作。

这是错误:

查询有问题:[SQLITE_ERROR] SQL 错误或缺失 数据库(没有这样的功能:WEEK) float getValueThisWeekByCatId(int cat_id, Date date);与函数 MONTH 相同

还有其他方法可以选择吗?

【问题讨论】:

  • Sqlite 日期和时间函数(以及它们接受的时间戳格式):sqlite.org/lang_datefunc.html 你可能想要strftime()
  • @Shawn strftime() 有效,但它总结了每个条目,而不仅仅是我想要的。例如,一个条目的日期为“2019-03-19”,值为“50”,一个条目的日期为“2019-02-20”,值为“30”。我的查询是这样的:Query("SELECT sum(value) FROM Entry WHERE cat_id = :cat_id AND strftime('%m', date) = strftime('%m', CURRENT_DATE) AND strftime('%Y', date) = strftime('%Y', CURRENT_DATE)") float getValueThisMonthByCatId(int cat_id); 应该是 50,但它是 80。
  • 查看这个Android房间数据库stackoverflow.com/a/48135885/7710739

标签: java android sqlite kotlin android-room


【解决方案1】:

有点晚了,但由于类似的问题,我偶然发现了这个问题,并且您在答案中使用 strftime 的解决方案是正确的。

尝试使用您的表格和查询,它对我有用:

 CREATE TABLE Entry(
       id int primary key,
       cat_id int,
       value int,
       date date
    );

    insert into entry (id, cat_id, value, date) values (1, 1, 50, '2019-03-19');
    insert into entry (id, cat_id, value, date) values (2, 1, 30, '2019-02-20');
    
    SELECT sum(value) 
    FROM Entry 
    WHERE cat_id = 1 
    AND strftime('%m', date) = strftime('%m', '2019-03-01')
    AND strftime('%Y', date) = strftime('%Y', '2019-03-01')

也适用于 CURRENTDATE,但显然必须使用当前日期条目。

Example

【讨论】:

  • 该问题不要求 SQL 答案。
猜你喜欢
  • 2023-01-12
  • 2021-02-17
  • 2021-07-22
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
相关资源
最近更新 更多