在开始和结束时间之间获取数据的SQLite命令是什么?

时间:2011-07-22 20:43:51

标签: database sqlite strftime

假设我的数据库名为“data”,其第二列称为“datetime”。我的日期时间格式为“7/22/2011 12:00:00”。如果我想在今天12:00到13:00之间获取信息,我该怎么做?

SELECT * FROM data WHERE 
strftime('%m/%d/%Y %H:%M:%S', datetime) > strftime('%m/%d/%Y %H:%M:%S', '7/22/2011 12:00:00') 
AND 
strftime('%m/%d/%Y %H:%M:%S', datetime) < strftime('%m/%d/%Y %H:%M:%S', '7/22/2011 13:00:00')

没有做到这一点。

2 个答案:

答案 0 :(得分:2)

我弄错了 - 对我感到羞耻。 strftime只会读取ISO 8601(或时间戳/ julian)值。 指定的格式不适用于输入 - 它仅适用于输出值。

因此,数据库中的数据仍必须具有自然排序。建议的格式是ISO 8601(字符串),时间戳(整数)和julian-date(浮点)。在数据库中使用m/d/y之类的日期将无法使用进行范围比较,因为它无法遵循自然顺序。

strftime和朋友只需生成一个对比较有用的值 - 例如可以将 ISO 8601 / timestamp / julian 输入转换为 custom / ISO 8601 / timestamp / julian-date 。但他们无法直接从转换自定义值。

修复数据库的最简单方法可能是使用像Python这样的语言来编写用于转换现有数据的脚本。还可以编写一个小型Java程序,利用SimpleDateFormat来解析现有值,并使用推荐类型之一将其写回。


历史:

从控制台中分片尝试(这将使必须更快尝试查询) - 第一个条件然后第二个条件。什么回报什么?为什么?一旦每件作品都正常工作,那么将它们放在一起就可以了。

有多个strftime格式错误 - 请参阅Date and Time了解格式并再次检查字符串:)另外,如果使用更合理的日期格式(ISO 8601),可以使用datetime并且不担心明确指定格式。 ISO 8601值也可以作为字符串进行词法排序 - 这是一个额外的优势。

我不确定Java SQLite adatper在作为参数传递给参数化查询时如何处理Date(参数化查询确实应该使用)...但无论如何,这是目前观察到的行为的次要问题。

快乐的编码。

答案 1 :(得分:0)

看起来你有一个糟糕的格式字符

SELECT * FROM data WHERE 
strftime('%m/%d/%Y %H:%H:%S', datetime) > strftime('%m/%d/%y %H:%M:%S', '7/22/2011 12:00:00') 
--                     ^ 
AND 
strftime('%m/%d/%y %H:%M:%S', datetime) < strftime('%m/%d/%y %H:%M:%S', '7/22/2011 13:00:00')