如何在sqlite数据库中插入数据类型日期(yyyy-MM-dd)并在android中的两个日期之间检索数据
我有一个Sqlite3数据库表,包含姓名,地址,出生日期详情。我想显示1990-01-01到1995-01-01的详细信息。
但Sqlite3数据库仅存储以下数据类型。
TEXT NUMERIC INTEGER REAL NONE
任何人都有一些提示来存储和检索日期格式数据..?
使用此代码将日期转换为毫秒格式,并将其作为INTEGER类型存储到数据库中
String someDate = "1995-01-01"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(someDate); System.out.println(date.getTime());
date.getTime() – 给出毫秒格式
以同样的方式转换您的输入(即1990-01-01至1995-01-01)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date1 = sdf.parse(1990-01-01); value1=date.getTime(); Date date2 = sdf.parse(1995-01-01); value2=date.getTime();
使用以下查询从数据库中检索
db.rawQuery("SELECT * FROM table_name WHERE column_name BETWEEN "+value1+" AND "+value2+"",null); or db.rawQuery("SELECT * FROM table_name WHERE column_name<="+value1+" AND column_name>="+value2+"",null);
根据我自己在Android中使用数据库做几个项目的经验,我的答案是:
不要将日期存储为字符串。 决不! 永远! 将它们存储为Unix时间戳,并在运行时根据需要对其进行格式化。
这里重要的是分离您的数据是什么以及数据的屏幕表示。 在数据库中存储数据的屏幕表示是错误的。
您始终将日期存储为INTEGER类型。
因此,例如,为了存储日期,您将存储值System.currentTimeInMilis
要在1990-01-01和1995-01-01之间进行选择,您将:
long val1 = new GregorianCalendar(1990, 01, 01).getTimeInMillis(); long val2 = new GregorianCalendar(1995, 01, 01).getTimeInMillis();
然后你将在这两个值之间执行正常的SELECT
语句。
要在屏幕上显示这些值为yyyy-MM-dd
您将使用SimpleDateFormat
类:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); long longDate = cursor.getLong(colNumber); // from the database String stringDate = dateFormat.format(new Date(longDate));
你可以做这样的事情
DateFormat df=new SimpleDateFormat("yyyy-MM-dd"); Date date1=df.parse("1990-01-01"); Date date2=df.parse("1995-01-01"); Date myDate=df.parse("1992-01-01"); // checking date if((date1.getTime()
由于您要使用的格式( yyyy-MM-dd
)的排序方式与String
相同(即对于您选择的任何日期x
和y
,如果x < y
作为Date
,则x < y
作为String
),您可以简单地将日期存储为数据库中的String
( TEXT
)。
在它们之间选择值时,您只需在SELECT
语句中使用WHERE
子句,如下所示:
SELECT * FROM yourTable WHERE yourDateFieldName > ? and yourDateFieldName < ?
然后,您可以使用DateFormat.format
来设置?
的值?
准备好的陈述的参数。 第一个参数是“开始”日期,第二个参数是“结束”日期。 如果您希望包含开始日期和结束日期的项目,则可以将<
with <=
和>
替换为>=
。
这为您提供了Date
的String
表示。 要从它转换为实际的Date
对象,您可以使用日期格式化程序的parse
方法(即SimpleDateFormat.parse
)。
另一种“更干净”的方法是使用SQLite日期和时间函数(参见此处 )。 虽然SQLite没有用于存储日期值的DATE
类型,但它具有帮助函数,您可以使用这些函数将TEXT
和NUMBER
值解释为语句中的日期。
如果您不需要对日期值进行额外处理,我建议您选择第一个解决方案,因为它应该更快,因为它只是比较TEXT
而不是从它们中解析和提取日期,然后比较提取的日期(I没有比较两种方法的速度,所以不要在这一方面接受我的话。 这种方法的编写和维护代码也较少,代码更易于阅读。
资料来源:
SQLite数据类型 - 用于比较两个TEXT
值的有效性
SimpleDateFormat - Android文档
您可以直接使用yyyy-MM-dd格式的日期,JDBC会理解它。 假设我们有一个表t1,其中c1为DATE类型
PreparedStatement ps = conn.prepareStatement("insert into t1 (c1) values (?)"); ps.setString(1, "2001-01-01"); ps.executeUpdate();
阅读日期也很简单
ResultSet rs = st.executeQuery("select c1 from t1"); rs.next(); Date date = rs.getDate(1);
ResultSet.getDate以java.sql.Dateforms返回结果,其toString方法以yyyy-MM-dd格式返回日期