我是Android开发的完全初学者,并且遇到了一个相当简单的问题(我想是))。
我正在尝试从SQLite(使用Room)检索过去30天的记录。
这是我的查询,不起作用-它不返回任何记录(来自@Dao类):
// getting fares for one day (custom-made query)
@Query("SELECT * FROM fare WHERE createdDateDb >=datetime('now', 'now', '-30 day')")
public List<Fare> getFaresOneDay();
但是,这个简单的查询可以检索没有指定日期的所有记录,
// getting all fare (via custom-made query)
@Query("SELECT * FROM fare ORDER BY createdDateDb DESC")
public List<Fare> getAllFares();
这是我的DateTypeConverter类:
public class DateTypeConverter {
@TypeConverter
public long convertDateToLong(Date date) {
return date.getTime();
}
@TypeConverter
public Date convertLongToDate(long time) {
return new Date(time);
}
}
这是将值分配给createdDateDb的方式(在将其插入数据库之前):
fare.setCreatedDateDb(new Date());
这是我的“实体”类:
@Entity(tableName = "fare")
public class Fare {
private String fareValue;
private String typeOfJob;
@PrimaryKey(autoGenerate = true) @NonNull
private Integer jobId;
// dates used for user display
private String createdDate;
private String createdTime;
// date var used for comparisons - not to be displayed for the user
private Date createdDateDb;
}
以及createDateDb的setter和getter
// #6 createdDateDb getter
public Date getCreatedDateDb() {
return createdDateDb;
}
// #6 createdDateDb setter
public void setCreatedDateDb(Date createdDateDb) {this.createdDateDb = createdDateDb; }
我真的很喜欢如何使用它的一些提示,因为感觉好像一无所获。 我还尝试了以下方法:
SELECT *
FROM fare
WHERE createdDateDb BETWEEN datetime('now', 'start of month') AND datetime('now', 'localtime')
不幸的是,它也不起作用。
谢谢!
答案 0 :(得分:1)
我遇到了这个问题,但我试图从 1 年前开始获取寄存器,当我搜索解决方案时,我发现了这篇文章。我是这样解决的
SELECT * FROM my_table WHERE CAST(my_date/1000 AS LONG) >= strftime('%s', 'now', '-12 month')
使用 calendar.getTime() 存储数据(以毫秒为单位)
说明:
作为 strftime 函数返回 SECONDS 的值,我必须将我的毫秒值除以 1000 并将其转换为 long,因为 sql 将除法结果作为整数返回,然后它才能正常工作
答案 1 :(得分:0)
使用DATE
SQLITE功能
@Query("SELECT * FROM fare WHERE createdDateDb >= DATE('now', '-30 day')")
答案 2 :(得分:0)
ConnectionClass objConnectionClass=new ConnectionClass();
con=objConnectionClass.getDataBaseConnection();
pstmtGetAdd=con.prepareStatement(SQL_INSERT_ADDRESS_QUERY,Statement.RETURN_GENERATED_KEYS);
pstmtGetAdd.setString(1, objRegisterVO.getAddress());
pstmtGetAdd.setInt(2, Integer.parseInt(objRegisterVO.getCityId()));
int addId=pstmtGetAdd.executeUpdate();
if(addId>0)
{
ResultSet rsVal=pstmtGetAdd.getGeneratedKeys();
rsVal.next();
addId=rsVal.getInt(1);
}
上面的这个返回空值,请正确使用
datetime('now', 'now', '-30 day')
答案 3 :(得分:0)
我发现了导致查询无法正常工作的原因-存储在createdDateDb中的Date的格式,即如果假设我们现在添加票价,则将以以下方式保存该票价: 2018年8月29日星期三16:48:55 GMT +01:00
当我将日期存储在createdDateDb中的方式更改为(yyyy-MM-dd)的方式时-查询神奇地按预期工作了;)。
Date c = Calendar.getInstance().getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = sdf.format(c);
非常感谢您的帮助-非常感谢!
答案 4 :(得分:0)
对于将来寻找答案的人们,这是我的解决方案:
(strftime('%s','now') - createdDateDb) < CAST(strftime('%s','1970-01-30') AS INTEGER)
在WHERE
子句