2012-10-22 49 views
4

我必須通過傳遞日期來從數據庫中選擇所有行。例如,爲了獲得具有日期10/23/2012如何在sqlite中按日期選擇行

所有行sqlite的分貝我這些信息存儲在DATE列:

01/01/1900 11:00:00 AM 

我曾嘗試用date()得到,但我什麼也得不到日期:

select itemId, date(dateColumn) from items 

所以我只需要比較日期,但無法找到如何在sqlite中執行此操作。

+1

使用'WHERE'子句選擇僅匹配X的日期 –

+0

我試過了。但日期也有時間部分。我只需要按日期獲取行。在where子句中,我需要一些東西來獲取並比較整個日期/時間中的日期。我用date()函數嘗試過,但它不起作用。 – 1110

回答

5

首先,格式化日期的ISO-8601標準選擇的itemId,dateColumn。將其包裝在Date()中以確保它作爲DATE進行處理。最後,構建您的範圍,使其包含從上午12:00起至第二天中午12:00之前的所有內容。

select itemId, dateColumn 
from items 
where dateColumn >= date('2012-10-23') 
    AND dateColumn < date('2012-10-23', '+1 day') 

的SQLite列沒有輸入。但是,如果您將列與DATE進行比較(如圖所示),則將列數據強制轉換爲日期就足夠了(如果不是強制轉換則爲空),並且比較將正常工作。

例如在SQLFiddle

create table items (
    itemid, datecolumn); 
insert into items select 
    1,'abc' union all select 
    2,null union all select 
    3,'10/23/2012 12:23' union all select 
    4,'10/23/2012' union all select 
    5,'2012-10-23 12:23' union all select 
    6,'2012-10-23' union all select 
    7,'2012-10-24 12:23' union all select 
    8,'2012-10-24' union all select 
    9,date('2012-10-24 12:23') union all select 
    10,date('2012-10-24'); 

結果:

itemid datecolumn 
5  2012-10-23 12:23 
6  2012-10-23 

注意,雖然行3和4 出現是日期,他們都沒有,因爲他們不符合ISO-8601格式是SQLite唯一識別的格式。

+0

把它寫成WHERE dateColumn BETWEEN date('2012-10-23')和date('2012-10-23','+1 day')'是不是更好? –

+1

這不會是因爲那將包括2012-10-24的00:00:00。 '> ='和'<'模式專門設計爲在第二天午夜之前結束。 – RichardTheKiwi

0
SELECT itemId,dateColumn FROM items WHERE dateColumn=date('YYYY-MM-DD HH:MM:SS'); 

SQLite Reference

+0

我只能通過這個YYYY-MM-DD(日期部分)。 – 1110

0

從項目 其中dateColumn = @date

4

在SQLite中,沒有數據類型DATE,它存儲爲字符串。因此,字符串必須匹配,確切地說是相等的。

由於我們不希望出現這種情況,因此您需要將日期欄中的值「僞造」爲僞日期,並將您的參數轉換爲僞日期,以便將它們進行比較:

SELECT itemId FROM items WHERE date(dateColumn) = date("2012-10-22"); 

請注意,date-command的格式爲YYYY-MM-DD,詳見this older question的答案。該問題還表明,您可以使用BETWEEN x AND y -command來獲取日期,並匹配一個範圍。