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



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

但 Sqlite3 数据库仅存储以下数据类型。

TEXT
NUMERIC
INTEGER
REAL
NONE

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

根据我自己在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));

使用此代码将日期转换为毫秒格式,并将其作为 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);

你可以做这样的事情

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");
    }

由于您要使用的格式(yyyy-MM-dd(的排序方式与String相同(即对于您选择的任何日期xy,如果x < y作为Date,则x < y作为String(,您可以简单地将日期存储为String s(TEXT(在您的数据库中。

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

 SELECT * FROM yourTable WHERE yourDateFieldName > ? and yourDateFieldName < ?

然后,您可以使用 DateFormat.format 为预准备语句的?参数设置值。第一个参数是"开始"日期,第二个参数是"结束"日期。如果您希望包括开始日期和结束日期的项目,可以将<替换为<=>替换为>=

这为您提供了DateString表示形式。要从该对象转换为实际的Date对象,您可以使用日期格式化程序的parse方法(即 SimpleDateFormat.parse (。

另一种"更干净"的方法是使用 SQLite 日期和时间函数(见这里(。虽然 SQLite 没有用于存储日期值的DATE类型,但它具有帮助程序函数,可用于将TEXT值解释为语句中的日期,并将值NUMBER

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

来源:

SQLite 数据类型 - 用于比较两个TEXT值的有效性

简单日期格式 - 安卓文档

您可以直接使用 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.Date 的形式返回结果,其 toString 方法以 yyyy-MM-dd 格式返回日期

相关内容

  • 没有找到相关文章