2011-11-18 103 views
50

我正在運行sqlite以選擇銷售報表的兩個範圍之間的數據。從日期兩者之間選擇的數據我用以下語句:SQL在日期之間選擇

SELECT * FROM test WHERE date BETWEEN "11/1/2011" AND "11/8/2011"; 

此語句中抓取所有的日期也不列外的標準。您輸入的日期格式與我返回的格式相同。我不確定有什麼問題,但感謝我能找到的任何幫助。謝謝!

+1

只是一個快速的相關提示,是非常有用的。如果您始終可以使用yyyy/MM/dd作爲格式。它會阻止可能是你的問題的討厭的區域差異問題。 – Haedrian

回答

69

SQLLite要求日期格式爲YYYY-MM-DD格式。由於數據庫中的數據和查詢中的字符串不是這種格式,因此可能將您的「日期」視爲字符串。

+0

更改日期格式後,我再次運行查詢爲 'SELECT date FROM test WHERE date BETWEEN「2011-11-1」AND「2011-11-2」;' 並取得2011-11-16的結果:/ – Zombian

+26

這是本月的第10日和第20日。試試'BETWEEN'2011-11-01'和'2011-11-02''。 –

+0

@LarryLustig couuld你告訴我如何修復我的, 我有同樣的問題,與SQL Server 2014 –

25

將數據更改爲使用sqlite datetime formats的格式。

YYYY-MM-DD 
YYYY-MM-DD HH:MM 
YYYY-MM-DD HH:MM:SS 
YYYY-MM-DD HH:MM:SS.SSS 
YYYY-MM-DDTHH:MM 
YYYY-MM-DDTHH:MM:SS 
YYYY-MM-DDTHH:MM:SS.SSS 
HH:MM 
HH:MM:SS 
HH:MM:SS.SSS 
now 
DDDDDDDDDD 

SELECT * FROM test WHERE date BETWEEN '2011-01-11' AND '2011-08-11' 
+0

正確的想法,但鑑於數據回來也是'MM/DD/YYYY'格式,我懷疑這仍然不起作用,因爲他的數據庫中的數據將被視爲字符串而不是日期。 –

+0

@EricPetroelje是的 - 但是一旦您將數據庫中的格式與查詢中的格式相匹配,它就可以工作。看起來它稍後進行了編輯,以包括更新數據庫後應更新的查詢 - 儘管查詢需要單引號而不是雙引號。 – vapcguy

9

SQLite中日之間進行選擇另一種方式是使用強大的的strftime功能:

SELECT * FROM test WHERE strftime('%Y-%m-%d', date) BETWEEN "11-01-2011" AND "11-08-2011" 

這些都是根據https://sqlite.org/lang_datefunc.html相當於:

date(...) 

strftime('%Y-%m-%d', ...) 

,但如果你想要更多的選擇,你有它。

+0

引號應該是單引號,否則查詢應該可以工作。 – vapcguy

4

或者您可以將您的字符串轉換爲日期格式,日期格式爲日期函數。即使日期在數據庫中作爲TEXT存儲。 這樣的(最可行的變體):

SELECT * FROM test WHERE date(date) 
BETWEEN date('2011-01-11') AND date('2011-8-11') 
+0

我認爲這個解決方案的問題在於你沒有指明文本的日期格式(例如,如果日期字符串存儲爲'MM/DD/YYYY')。我嘗試了這種方法,但它對我不起作用,我認爲這是原因。 –

1
SELECT * 
FROM TableName 
WHERE julianday(substr(date,7)||'-'||substr(date,4,2)||'-'||substr(date,1,2)) BETWEEN julianday('2011-01-11') AND julianday('2011-08-11') 

注意,我使用的格式:dd/mm/yyyy

如果使用d/M/YYYY,變化substr()

希望這會幫助你。

+0

大量使用拼接!投了票。注意,你不需要使用'julianday()',並且使用它假設你的日期是UTC,因爲'julianday()'計算的是基於GMT的時間,所以你最終可以包含你的日期如果你的日期是在當地時間,那麼你不需要,並且包括你所做的日期。你應該可以做'SELECT * FROM TableName WHERE substr(date,7)||' - '|| substr(date,4,2)||' - '|| substr(date,1,2) '2011-01-11'和'2011-08-11''之間,它應該工作。 – vapcguy

+0

特別感謝[Jeff](http://stackoverflow.com/users/781965/jeff)和[vapcguy](http://stackoverflow.com/users/1181535/vapcguy)您的互動真的令人鼓舞 –

1

特別感謝Jeffvapcguy您的互動真的令人鼓舞。

這裏是一個更復雜的語句時「/」之間的長度是未知::

SELECT * FROM tableName 
WHERE julianday(
    substr(substr(date, instr(date, '/')+1), instr(substr(date, instr(date, '/')+1), '/')+1) 
||'-'|| 
    case when length(
    substr(date, instr(date, '/')+1, instr(substr(date, instr(date, '/')+1),'/')-1) 
    )=2 
    then 
    substr(date, instr(date, '/')+1, instr(substr(date, instr(date, '/')+1), '/')-1) 
    else 
    '0'||substr(date, instr(date, '/')+1, instr(substr(date, instr(date, '/')+1), '/')-1) 
    end 
||'-'|| 
    case when length(substr(date,1, instr(date, '/')-1)) =2 
    then substr(date,1, instr(date, '/')-1) 
    else 
    '0'||substr(date,1, instr(date, '/')-1) 
    end 
) BETWEEN julianday('2015-03-14') AND julianday('2015-03-16') 
+0

感謝您的恭維,並得把它交給你,因爲你有能力做子字符串。不過,我對另一篇文章中關於'julianday()'的評論仍然適用。除了你在條件邏輯中添加單位數天和數月的前導零之外,這與其他答案基本相同。可能應該已經添加到其他答案,或用此編輯替換它。 Upvoted,因爲它更正確,但。 – vapcguy