2011-11-18 158 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

相关问题