2012-05-31 93 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

相關問題