我正在運行sqlite以選擇銷售報表的兩個範圍之間的數據。從日期兩者之間選擇的數據我用以下語句:SQL在日期之間選擇
SELECT * FROM test WHERE date BETWEEN "11/1/2011" AND "11/8/2011";
此語句中抓取所有的日期也不列外的標準。您輸入的日期格式與我返回的格式相同。我不確定有什麼問題,但感謝我能找到的任何幫助。謝謝!
我正在運行sqlite以選擇銷售報表的兩個範圍之間的數據。從日期兩者之間選擇的數據我用以下語句:SQL在日期之間選擇
SELECT * FROM test WHERE date BETWEEN "11/1/2011" AND "11/8/2011";
此語句中抓取所有的日期也不列外的標準。您輸入的日期格式與我返回的格式相同。我不確定有什麼問題,但感謝我能找到的任何幫助。謝謝!
SQLLite要求日期格式爲YYYY-MM-DD
格式。由於數據庫中的數據和查詢中的字符串不是這種格式,因此可能將您的「日期」視爲字符串。
更改日期格式後,我再次運行查詢爲 'SELECT date FROM test WHERE date BETWEEN「2011-11-1」AND「2011-11-2」;' 並取得2011-11-16的結果:/ – Zombian
這是本月的第10日和第20日。試試'BETWEEN'2011-11-01'和'2011-11-02''。 –
@LarryLustig couuld你告訴我如何修復我的, 我有同樣的問題,與SQL Server 2014 –
將數據更改爲使用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'
正確的想法,但鑑於數據回來也是'MM/DD/YYYY'格式,我懷疑這仍然不起作用,因爲他的數據庫中的數據將被視爲字符串而不是日期。 –
@EricPetroelje是的 - 但是一旦您將數據庫中的格式與查詢中的格式相匹配,它就可以工作。看起來它稍後進行了編輯,以包括更新數據庫後應更新的查詢 - 儘管查詢需要單引號而不是雙引號。 – vapcguy
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', ...)
,但如果你想要更多的選擇,你有它。
引號應該是單引號,否則查詢應該可以工作。 – vapcguy
或者您可以將您的字符串轉換爲日期格式,日期格式爲日期函數。即使日期在數據庫中作爲TEXT存儲。 這樣的(最可行的變體):
SELECT * FROM test WHERE date(date)
BETWEEN date('2011-01-11') AND date('2011-8-11')
我認爲這個解決方案的問題在於你沒有指明文本的日期格式(例如,如果日期字符串存儲爲'MM/DD/YYYY')。我嘗試了這種方法,但它對我不起作用,我認爲這是原因。 –
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()
希望這會幫助你。
大量使用拼接!投了票。注意,你不需要使用'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
特別感謝[Jeff](http://stackoverflow.com/users/781965/jeff)和[vapcguy](http://stackoverflow.com/users/1181535/vapcguy)您的互動真的令人鼓舞 –
這裏是一個更復雜的語句時「/」之間的長度是未知::
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')
感謝您的恭維,並得把它交給你,因爲你有能力做子字符串。不過,我對另一篇文章中關於'julianday()'的評論仍然適用。除了你在條件邏輯中添加單位數天和數月的前導零之外,這與其他答案基本相同。可能應該已經添加到其他答案,或用此編輯替換它。 Upvoted,因爲它更正確,但。 – vapcguy
只是一個快速的相關提示,是非常有用的。如果您始終可以使用yyyy/MM/dd作爲格式。它會阻止可能是你的問題的討厭的區域差異問題。 – Haedrian