假设我的数据库名为“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')
没有做到这一点。
答案 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')