Java 如何在sqlite数据库中插入数据类型date(yyyy-MM-dd)并在android中检索两个日期之间的数据

Java 如何在sqlite数据库中插入数据类型date(yyyy-MM-dd)并在android中检索两个日期之间的数据,java,android,sqlite,Java,Android,Sqlite,我有一个Sqlite3数据库表,包含姓名、地址、出生日期的详细信息。我想显示1990-01-01到1995-01-01的详细信息 但Sqlite3数据库只存储以下数据类型 TEXT NUMERIC INTEGER REAL NONE 任何人都有一些存储和检索日期格式数据的提示。您可以这样做 DateFormat df=new SimpleDateFormat("yyyy-MM-dd"); Date date1=df.parse("1990-01-01"); Date date2

我有一个Sqlite3数据库表,包含姓名、地址、出生日期的详细信息。我想显示1990-01-01到1995-01-01的详细信息

但Sqlite3数据库只存储以下数据类型

TEXT
NUMERIC
INTEGER
REAL
NONE

任何人都有一些存储和检索日期格式数据的提示。

您可以这样做

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()<myDate.getTime())&&(myDate.getTime()<date2.getTime())){
        System.out.println(df.format(myDate)+" is in this range");
    }else{
        System.out.println(df.format(myDate)+" is not in this range");
    }
DateFormat df=新的简化格式(“yyyy-MM-dd”);
日期1=df.parse(“1990-01-01”);
日期2=df.parse(“1995-01-01”);
日期myDate=df.parse(“1992-01-01”);//核对日期

如果((date1.getTime()可以直接使用yyyy-MM-dd格式的日期,JDBC就会理解它

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.Date的形式返回结果,其toString方法以yyyy-MM-dd格式返回日期,因为您要使用的格式(
yyyy-MM-dd
)的顺序与
字符串的顺序相同(即,对于任何日期
x
y
,如果选择
x
作为
日期
,然后选择
x
作为
字符串
),您只需将日期作为
字符串
存储在数据库中即可

在选择它们之间的值时,只需在
SELECT
语句中使用
WHERE
子句,如下所示:

 SELECT * FROM yourTable WHERE yourDateFieldName > ? and yourDateFieldName < ?
从表中选择*,其中yourDateFieldName>和yourDateFieldName<?
然后,您可以使用
DateFormat.format
为准备好的语句的
参数设置值。第一个参数是“开始”日期,第二个参数是“结束”日期。如果希望包含开始日期和结束日期的项目,可以将
=

这为您提供了
日期的
字符串
表示形式。要将其转换为实际的
日期
对象,您可以使用日期格式化程序的
解析
方法(即
SimpleDataFormat.parse

另一种“更干净”的方法是使用SQLite日期和时间函数(请参阅)。虽然SQLite没有用于存储日期值的
date
类型,但它有帮助函数,您可以使用这些函数将
TEXT
NUMBER
值解释为语句中的日期

如果您不需要对日期值进行额外处理,我建议使用第一种解决方案,因为它应该更快,因为它只是比较
文本
s,而不是解析和提取日期,然后比较提取的日期(我还没有比较这两种方法的速度,所以不要相信我的话)。这种方法编写和维护的代码更少,代码更容易阅读

资料来源:

-用于比较两个
文本
值的有效性


-Android文档

根据我自己在Android中使用数据库进行多个项目的经验,我的答案是:

不要将日期存储为字符串。永远不要!永远不要!将其存储为Unix时间戳,并在运行时根据需要对其进行格式化

这里重要的一点是将数据和数据的屏幕表示形式分开。将数据的屏幕表示形式存储在数据库中是错误的

您将始终将日期存储为整数类型

例如,要立即存储日期,您将存储值
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
,您将使用
SimpleDataFormat
类:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
long longDate = cursor.getLong(colNumber); // from the database
String stringDate = dateFormat.format(new Date(longDate));

使用此代码将日期转换为毫秒格式,并将其作为整数类型存储到数据库中

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)

使用以下查询从数据库中检索

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);
db.rawQuery(“从表名称中选择*,其中列名称介于“+value1+”和“+value2+”)之间,为空);
或
db.rawQuery(“从表中选择*列,其中列名=“+value2+”,null);

请参阅。或者只保存时间戳而不是格式化日期。您是要检索日期格式还是实际日期?例如,检索数据格式数据将产生
yyyy-MM-dd
,检索实际日期将分别产生
1990-01-01
1995-01-01
。它们表示Date现在已被弃用。GregorianCalendar会更好吗?
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);