2012-05-31 96 views
14

我存储日期为String在我的数据库,格式如下:比较日期(存储为字符串)在android sqlite数据库?

YYYY-MM-DD HH:MM:SS 

这是支持的格式(http://www.sqlite.org/lang_datefunc.html)之一。现在我想比较这些存储日期(以及字符串)与其他日期。我的日期都存储在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)) 

和此之间(而不是使用< =和> =)

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

和所有其它可能的组合。我做错了什么,我是愚蠢的,还是文件存在,或者我错过了一件非常重要的事情?试图找到解决方案几个小时,但没有什么作品...

回答

17

如果你存储日期为字符串格式

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给出的代码片段,它与操作符是同一个约定。

BETWEEN运算符在逻辑上相当于一对比较。 “x BETWEEN y AND z”等价于“x> = y AND x < = z”除了使用BETWEEN之外,x表达式仅评估一次。看sqlite3 docs

+0

我不相信这是正确的......从SQLite的文档“的日期()函数返回以下格式的日期:YYYY-MM-DD”。我读到它的方式意味着即使数据以DateTime格式存储,使用Date()将只返回它的日期部分。这是不正确的? – Barak

+0

这个工作,但仍不能理解这一点。在文档中明确指出,该日期或日期时间返回DATE。而我的专栏是字符串。那么怎么可能,你可以比较String(= mydate)与日期(使用datetime函数从字符串2000-01-01 00:00:00创建的日期)?它不合逻辑。为什么你没有把Datetime也应用到我的专栏,如果它的字符串? – qkx

+0

所以实际上,对我来说这在逻辑上是正确的:Datetime(mydate string)<= Datetime(另一个日期字符串)。但是,这不工作,你的代码做的工作;)滑稽 – qkx

6
SELECT * 
FROM MyTable 
WHERE 
    column_date BETWEEN '2000-01-01 00:00:00' AND '2050-01-01 23:00:59' 

应该做的伎俩。这只使用字符串,但你说这将是合适的。

错误是缺少时间部分或仅在日期部分执行substr。然后数据/时间转换功能可能会给出错误的东西。

+0

这工作...但它怎么可能?是否将字符串与日期函数(之间)进行比较? – qkx

+0

我以为column_date是一个字符串 - VARCHARS?但是DATETIME也可以,因为标准* 2000-01-01T00:0:00'和'2000-01-01 00:00:00'也可以转换。 –

+0

我们可以检查日期01-01-2011 00:00:00? – CoronaPintu

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)) 
+0

我们可以追查这个Formate 01-01-2000吗? – CoronaPintu

+0

这个问题解决了 – Cristiana214

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

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

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

这对我的作品。

+0

这只适用于当前月份,更改月份后不起作用。 – Cheerag

相关问题