1

假设我的数据库称为“数据”,它的第二列称为“日期时间”。我的日期时间格式是“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')

不成功。

4

2 回答 2

2

我错了——真丢脸。strftime只会读取 ISO 8601(或时间戳/朱利安)值。指定的格式不适用于输入- 它仅适用于输出值。

出于这个原因,数据库的数据必须仍然具有自然排序才能进行排序。建议的格式是 ISO 8601(字符串)、时间戳(整数)和 julian-date(浮点数)。使用m/d/y数据库中的日期不适用于范围比较,因为它不符合自然顺序。

strftime和朋友只允许生成对比较有用的值之一——例如,可以从ISO 8601/timestamp/julian输入转换为custom/ISO 8601/timestamp/julian-date。但是,它们不能直接自定义值转换。

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


历史:

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

有多个 strftime 格式错误- 请参阅日期和时间以了解格式并再次检查字符串 :) 此外,如果使用更合理的日期格式(ISO 8601),则可以使用datetime而不必担心明确指定格式。ISO 8601 值也可以作为字符串在词法上排序——这是一个额外的优势。

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

快乐编码。

于 2011-07-22T20:48:40.620 回答
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')
于 2011-07-22T20:56:55.283 回答