18

我将日期存储String在我的数据库中,格式如下:

YYYY-MM-DD HH:MM:SS

这是支持的格式之一(http://www.sqlite.org/lang_datefunc.html)。现在我想将这些存储的日期(嗯,字符串)与另一个日期进行比较。我的日期存储在 column column_date,所以我正在尝试这个:

SELECT  * FROM MyTable
WHERE 
(Date(column_date) >= Date (2000-01-01) AND Datetime(column_date) <= Datetime (2050-01-01))

当我阅读文档时,The date and time functions use a subset of IS0-8601 date and time formats. The date() function returns the date in this format: YYYY-MM-DD.我想,我做得对 - 我从存储的字符串创建日期并将其与从另一个字符串创建的日期进行比较。

但它不起作用,即使column_date是今年的日期,而且你可以看到开始和结束日期非常仁慈。也试过这个(使用日期时间而不是日期):

SELECT  * FROM MyTable
    WHERE 
    (datetime(column_date) >= Date (2000-01-01) AND datetime(column_date) <= Datetime (2050-01-01))

和这个(使用 between 代替 <= 和 >=)

SELECT  * FROM MyTable
    WHERE 
    (Date(column_date) between Date (2000-01-01) AND Datetime (2050-01-01))

以及所有其他可能的组合。我到底做错了什么,是我愚蠢,还是文档在撒谎,或者我错过了一些非常重要的事情?试图找到解决方案几个小时,但没有任何效果......

4

5 回答 5

22

如果您将日期存储为格式中的字符串

YYYY-MM-DD HH:mm:ss  

====> 那么您的日期字段是 DateTime 数据类型

因此你必须使用这样的查询

select * 
  from MyTable 
  where mydate >= Datetime('2000-01-01 00:00:00') 
  and mydate <= Datetime('2050-01-01 23:00:59')

您还可以使用@Joop Eggen 给出的片段与运算符之间的th 相同的方法。

BETWEEN运算符在逻辑上等价于一对比较。"x BETWEEN y AND z"等价于"x>=y AND x<=z",除了在 BETWEEN 中,x 表达式只计算一次。见 sqlite3文档

于 2012-05-31T12:02:36.070 回答
7
SELECT *
FROM MyTable
WHERE 
    column_date BETWEEN '2000-01-01 00:00:00' AND '2050-01-01 23:00:59'

应该做的伎俩。这仅使用字符串,但您说这很合适。

错误是缺少时间部分或仅对日期部分不做 substr。然后数据/时间转换函数也可能给出错误的东西。

于 2012-05-31T11:47:46.327 回答
3

我想你的问题在这里...

AND Datetime(column_date) <= Datetime (2050-01-01))

你为什么在这里使用日期时间而不是日期?

试试这个:

SELECT  * FROM MyTable WHERE (Date(column_date) >= Date (2000-01-01) AND Date(column_date) <= Date (2050-01-01))
于 2012-05-31T11:50:26.423 回答
2

SQLite 表中归档的日期将为 TEXT,日期数据应存储为“2012-12-31 00:12:00”格式,比较不会给您带来麻烦,如果我们认为字段是 date_from 和 date_to 并且我们正在存储当前日期在 to_date 那么我们应该得到当前日期如下和

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String to_date = sdf.format(new Date());

并且 SQL 查询应该是

    crs = db.rawQuery(
      "SELECT _id, date_from, date_to, done_or_not, list_name " +
      "FROM list_tbl " +
      "WHERE " +
      "date_from <= Datetime('"+to_date+"') AND date_to >= Datetime('"+to_date+"')", null);
于 2012-12-31T17:29:46.170 回答
0

比较 android SQLite 数据库中的日期(存储为字符串)。12/07/2015在格式中使用日期并使用如下查询:

SELECT * FROM tableName WHERE Date >=('12/07/2015') and appointmentDate <('13/07/2015')";

这对我有用。

于 2015-07-11T09:36:42.023 回答