我正在努力在SQLite3中实现日期(对于android)。根据文档(https://www.sqlite.org/datatype3.html和http://www.sqlite.org/lang_datefunc.html),SQLite没有具体的日期和时间数据类型,因此它可以存储为TEXT或INTEGER。我试过了两个,但他们给出了同样的错误结果。在互联网上阅读 lot 并尝试我能想到的一切后,我作为最后的手段来到这里。
所以,现在针对这个问题。这个想法实际上非常简单。我有一个包含项目的表,有一个日期列。现在我想要选择此数据库中具有今天或之前(即今天或过去)日期的所有项目。在我目前的实现中,我将日期存储为整数,因为大多数人似乎都认为这是可行的方法。
以下是插入项目的(简化)代码。
Calendar calendar = GregorianCalendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0); // Might not be necessary
calendar.add(Calendar.DAY_OF_YEAR, 4); // Today plus 4 days
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_DATE, calendar.getTimeInMillis()); // Today as integer/long
long id = db.insert(TABLE_ITEMS, null, values); // Add to db
接下来我想选择日期等于或低于今天的项目:
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
String[] columns = new String[]{COLUMN_ID, COLUMN_TEXT, COLUMN_DATE};
String[] selectArg = new String[]{"date('now')"};
Cursor cItems = db.query(TABLE_ITEMS, columns, COLUMN_DATE + "<= ?", selectArg, null, null, null);
//Cursor cItems = db.query(TABLE_ITEMS, columns, "strftime('%Y-%m-%d'," + COLUMN_DATE + ")" + select, selectArg, null, null, null);
//Cursor cItems = db.query(TABLE_ITEMS, columns, "date(" + COLUMN_DATE + ")" + select, selectArg, null, null, null);
现在选择所有行,以及将来有日期的行。谁能告诉我我需要做些什么?
提前致谢!
修改
我发现sqlite以秒为单位存储日期整数(这是正确的吗?)。那么这意味着我在数据库中放入的值应为Math.round(calendar.getTimeInMillis()/1000
,以便在几秒钟内得到它?但是它会更少,因为以毫秒为单位的日期应始终大于以秒为单位的日期。无论如何,我试过了,但它也不起作用。
答案 0 :(得分:2)
感谢CL的见解。给了我,我修正了一些琐碎的错误。
回顾一下SQLite文档,我发现有两种方法可以存储没有时间的日期。朱利安日期号码或日期字符串YYYY-MM-DD
。没有现成的功能来获取java / android中的Julian日期号,因此我选择再次返回字符串格式。
我刚才想到的第二个错误是selectArgs被认为是文本,因此将date('now', 'localtime')
放在那里是行不通的。
以下是可行的最终脚本。
Calendar calendar = GregorianCalendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0); // Might not be necessary
calendar.add(Calendar.DAY_OF_YEAR, 4); // Today plus 4 days
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
ContentValues values = new ContentValues();
values.put(COLUMN_DATE, dateFormat.format(calendar.getTime())); // Date as string
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
long id = db.insert(TABLE_ITEMS, null, values); // Add to db
要获取数据:
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
String[] columns = new String[]{COLUMN_ID, COLUMN_TEXT, COLUMN_DATE};
String[] selectArg = new String[]{};
Cursor cItems = db.query(TABLE_ITEMS, columns, COLUMN_DATE + "<= date('now', 'localtime')", selectArg, null, null, null);
CL,非常感谢你的帮助!最后它很简单......
答案 1 :(得分:0)
date()
和strftime('%Y-%m-%d')
都不会以您的格式返回日期。
要将日期转换为秒格式,您必须使用strftime('%s', ...)
,并将结果字符串转换为数字。