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

3

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

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

TEXT
NUMERIC
INTEGER
REAL
NONE

有没有人有存储和检索日期格式数据的提示?

请查看文档 - CL.
或者只需保存时间戳而不是格式化日期。 - Sherif elKhatib
你是想获取日期格式还是实际日期?例如,检索数据格式数据将产生 yyyy-MM-dd,而检索实际日期将分别产生 1990-01-011995-01-01 - lucian.pantelimon
5个回答

5

根据我在Android数据库项目中的经验,我的答案是:

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

重要的是要区分您的数据和您数据的屏幕表示之间的区别。将数据的屏幕表示存储在数据库中是错误的。

您始终会将日期存储为INTEGER类型。

例如,要存储当前日期,您将存储值System.currentTimeMillis()

要在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));

3
使用此代码将日期转换为毫秒格式并将其存储到数据库中作为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年1月1日到1995年1月1日)

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

他们说Date现在已经过时了。GregorianCalendar会更好吗? - IgorGanapolsky

2

你可以像这样做:

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

1
由于您想使用的格式(yyyy-MM-dd)与String相同(即对于任何日期xy,如果将x < y作为Date,则x < y作为String),因此您可以在数据库中将日期简单地存储为StringTEXT)。
在选择它们之间的值时,您只需要在SELECT语句中使用一个WHERE子句,如下所示:
 SELECT * FROM yourTable WHERE yourDateFieldName > ? and yourDateFieldName < ?

您可以使用 DateFormat.format 来设置预处理语句中 ? 参数的值。第一个参数将是“开始”日期,第二个参数将是“结束”日期。如果您想要包括开始和结束日期上的项目,则可以将 < 替换为 <=,将 > 替换为 >=
这会给您一个 DateString 表示形式。要从中转换为实际的 Date 对象,您可以使用日期格式化程序的 parse 方法(即 SimpleDateFormat.parse)。
另一种“更清晰”的方法是使用 SQLite 日期和时间函数(请参见 此处)。虽然 SQLite 没有用于存储日期值的 DATE 类型,但它有助手函数,您可以在语句中将 TEXTNUMBER 值解释为日期。
如果您的日期值不需要额外处理,我建议选择第一种解决方案,因为它应该更快,因为它仅比较TEXT而不是解析和提取日期,然后比较提取的日期(我没有比较这两种方法的速度,所以不要只听我的)。这种方法还有更少的代码需要编写和维护,代码也更容易阅读。
来源: SQLite数据类型-用于比较两个 TEXT 值的有效性 SimpleDateFormat-Android文档

0

您可以直接使用yyyy-MM-dd格式的日期,JDBC会理解它。假设我们有一个带有DATE类型c1的表t1。

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 格式的日期


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接