我有一个Sqlite3数据库表格,包含姓名、地址、出生日期等详细信息。我想要显示1990年1月1日到1995年1月1日的详细信息。
但是Sqlite3数据库只存储以下数据类型。
TEXT
NUMERIC
INTEGER
REAL
NONE
有没有人有存储和检索日期格式数据的提示?
根据我在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));
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
)与String
相同(即对于任何日期x
和y
,如果将x < y
作为Date
,则x < y
作为String
),因此您可以在数据库中将日期简单地存储为String
(TEXT
)。SELECT
语句中使用一个WHERE
子句,如下所示: SELECT * FROM yourTable WHERE yourDateFieldName > ? and yourDateFieldName < ?
DateFormat.format
来设置预处理语句中 ?
参数的值。第一个参数将是“开始”日期,第二个参数将是“结束”日期。如果您想要包括开始和结束日期上的项目,则可以将 <
替换为 <=
,将 >
替换为 >=
。Date
的 String
表示形式。要从中转换为实际的 Date
对象,您可以使用日期格式化程序的 parse
方法(即 SimpleDateFormat.parse
)。DATE
类型,但它有助手函数,您可以在语句中将 TEXT
和 NUMBER
值解释为日期。TEXT
而不是解析和提取日期,然后比较提取的日期(我没有比较这两种方法的速度,所以不要只听我的)。这种方法还有更少的代码需要编写和维护,代码也更容易阅读。 TEXT
值的有效性
SimpleDateFormat-Android文档您可以直接使用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 格式的日期
yyyy-MM-dd
,而检索实际日期将分别产生1990-01-01
和1995-01-01
。 - lucian.pantelimon