如何从 Sqlite ( android ) 中的 datetime 字段获取日期

Posted

技术标签:

【中文标题】如何从 Sqlite ( android ) 中的 datetime 字段获取日期【英文标题】:How get date from datetime field in Sqlite ( android ) 【发布时间】:2014-07-02 05:20:36 【问题描述】:

在我的应用程序中,我将(任务的)创建日期和时间作为日期时间字段存储在数据库中。

在其中一项活动中,我试图显示创建的所有任务列表,并且 我需要创建日期(只是日期而不是日期时间)作为我的第一列。

我使用了一个列表视图和简单的光标适配器来填充列表视图。

private String [] from =  "CREATION_DATE" ,  "_id" , DataBaseHandler.DESCRIPTION ;
private int[] to =R.id.fh_list_entryDate ,R.id.fh_list_credits, R.id.fh_desc ;
//date string will be in yyyy/mm/dd format.
fh_cursor= dbHandler.getAllHistory(bun.getString("st_date"),bun.getString("end_date")); 
dataAdapter = new SimpleCursorAdapter(this,R.layout.full_history_list,fh_cursor,from,to,0);
listView.setAdapter(dataAdapter);

“fh_list_entryDate”的 xml

<EditText
        android:id="@+id/fh_list_entryDate"
        android:layout_
        android:layout_
        android:layout_marginStart="4dp"
        android:inputType="date"
        android:focusable="false"
        android:gravity="center"
        android:textAppearance="?android:attr/textAppearanceMedium" />

在 getAllHistory 方法中,查询如下所示:

String historyQuery = "SELECT CREATION_DATE , CREDITS _id , DESCRIPTION FROM "+
                    ACTIVITY_DETAILS_TABLE_NAME +
                    " WHERE START_DT > ? "+" AND END_DT < ? ";
fh_cursor = sqlDB.rawQuery(historyQuery, new String[] st_date,end_date);

如果我使用上面的代码,我会在第一列中看到“Tue Jul 01 23:21:05 GMT-04:00 2014”。

我阅读了“strftime”并将查询修改为:

String historyQuery = "SELECT strftime('%Y-%m-%d', CREATION_DATE) CREATION_DATE, 
                       CREDITS _id , DESCRIPTION FROM "+
                    ACTIVITY_DETAILS_TABLE_NAME +
                    " WHERE START_DT > ? "+" AND END_DT < ? ";

然后我得到 null 而不是 date。

我的要求是只显示日期部分。最好采用 yyyy/mm/dd 格式。或 yyyy-mm-dd 格式。

我猜一个选项是我们可以迭代 fh_cursor 并使用 java 代码中的 SimpleDateFormat 将日期时间转换为所需格式,而不是使用 SimpleCursorAdapter。 我不想那样做。有没有办法让我只修改查询?

【问题讨论】:

阅读documentation。 【参考方案1】:

尝试在 WHERE 子句中使用 strftime,如下所示:

String historyQuery = "SELECT strftime('%Y-%m-%d', CREATION_DATE) CREATION_DATE, 
                       CREDITS _id , DESCRIPTION FROM "+
                     " ACTIVITY_DETAILS_TABLE_NAME "+
                     " WHERE strftime('%Y-%m-%d',START_DT) > ? "+
                     " AND strftime('%Y-%m-%d',END_DT) < ? ";

【讨论】:

我尝试使用上述查询.. 现在 fh_cursor 为空。我什至尝试将字符串的日期格式更改为 yyyy-mm-dd 仍然为空。【参考方案2】:

您应该注意,sqlite 中没有任何 DATETIME 数据类型。而不是使用 NUMERIC 数据类型来存储日期。在将日期插入表格之前,使用 SimpleDateFormat 将该日期转换为 longmillis。

long date = SimpleDateFormat("yyyy-MM-dd").parse("your-date-text").getTime();

现在当从表中获取日期时,遍历游标 并得到 datelongmillis 一样长

long datemillis = cursor.getLong(cursor.getColumnIndex("date_column_name"));

现在是时候以您的格式显示日期了,再次使用 SimplaDateFormat。

String dateString = SimpleDateFormat("yyyy-MM-dd").format(new Date(datemillis));

【讨论】:

感谢您的回复。是的,SQLITE 没有 Datetime 数据类型。而不是使用 simpleCursorAdapter.. 我写了一个扩展 cursorAdapter 的新类。在覆盖 bindView 方法时,我更改了日期格式。使用 simpleDateFormat。

以上是关于如何从 Sqlite ( android ) 中的 datetime 字段获取日期的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Sqlite ( android ) 中的 datetime 字段获取日期

如何使用Android从sqlite中的表中删除所有记录?

如何使用游标从sqlite android中的多个列中获取数据

如何从android studio中的recycler视图将数据添加到SQLite数据库中

Android Sqlite:如何从 Listview 中获取 SQLite rowId?

如何从 sqlite DB 中列出表名——Android [重复]