我有一个 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 年 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);
你可以做这样的事情
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
) 以与 a 相同的方式排序String
(即对于任何日期x
,并且y
您会选择,如果x < y
为 a Date
,则为x < y
a String
),您可以简单地将日期作为String
s ( TEXT
) 存储在您的数据库中。
在选择它们之间的值时,您只需WHERE
在语句中使用一个子句,SELECT
如下所示:
SELECT * FROM yourTable WHERE yourDateFieldName > ? and yourDateFieldName < ?
然后,您可以使用DateFormat.format
来设置?
准备好的语句的参数值。第一个参数是“开始”日期,第二个参数是“结束”日期。如果您希望包含开始日期和结束日期的项目,您可以替换为<
和<=
。>
>=
这为您提供String
了一个Date
. 要将其转换为实际Date
对象,您可以使用日期格式化程序的parse
方法(即SimpleDateFormat.parse
)。
另一种“更干净”的方法是使用 SQLite 日期和时间函数(参见此处)。虽然 SQLite 没有用于存储日期值的类型,但它具有可用于将值解释为语句中的日期的DATE
辅助函数。TEXT
NUMBER
如果您不需要对日期值进行额外处理,我建议您使用第一个解决方案,因为它应该更快,因为它只是比较TEXT
s 而不是从中解析和提取日期,然后比较提取的日期(我没有'没有比较两种方法的速度,所以不要相信我的话)。这种方法还需要编写和维护更少的代码,并且代码更易于阅读。
资料来源:
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.Date 形式返回结果,其 toString 方法以 yyyy-MM-dd 格式返回日期