SQLite/Rails日期时间查询问题

4
我正在构建一个Rails应用程序,该应用程序可以根据计划创建订单。计划采用hh:mm格式的时间,并且每周的每一天都有标记。一个方法会定期检查计划,并创建计划所需的任何订单。
首先,我使用Ruby DateTime对象构建本周订单的时间,然后检查它是否存在,如果不存在则创建,例如:
order = Order.where( :delivery_datetime = del_datetime )
unless order.any?
  Order.create( :status => 'Estimated', :delivery_datetime => del_datetime )
end

这在我的机器上按预期工作,但当其他人从存储库中取走时,它会每次重新创建订单。我调查了它使用的SQL,问题似乎是它创建了一个略微不同于插入语句的where子句:

SELECT COUNT(*) FROM orders WHERE delivery_datetime = '2011-06-30 18:00:00.000000'
INSERT INTO orders (delivery_datetime) VALUES ('2011-06-30 18:00:00.000000000')

因此,区别在于部分秒字段中多了三个零。我理解SQLite没有真正的日期类型,因此这些不同只是因为字符串不同。我现在遇到的问题是,似乎无法强制插入字符串的格式。例如,即使我执行以下操作:
Order.create( :status => 'Estimated',
               :delivery_datetime => del_datetime.strftime( '%Y-%m-%d %H:%M' ) )

插入语句仍使用“标准”格式 - 但在我的实例上有6个零,而在另一个实例上有9个。


似乎有些奇怪-我以前从未见过这种情况。你能展示一下用于实例化del_datetime变量的代码吗?另外,你的Order.where()代码行可以被Order.find_by_delivery_dateime(del_datetime)替换,接着是"unless order"。这将生成略微不同的SQL查询 - 不确定它是否能解决你的问题。 - Frankie Roberto
它使用这段可怕的代码进行实例化:del_datetime = DateTime.parse( offset_datetime.strftime( "%Y-%m-%d " ) + schedule.delivery_time )(我是Rails的新手,但我相信这段代码有更好的替代方案,不过在我的机器上它能工作)。 - asc99c
1个回答

0

没有答案!Stack Overflow上从未见过这种情况。目前,我通过将数据库字段声明为字符串,然后使用strftime确保日期格式保持不变来“修复”它。这有效,但似乎不是理想的解决方案。

在阅读Sqlite文档中有关数据类型为“misfeature”的所有内容之后,我考虑放弃它并选择Postgres或类似的数据库。我希望datetimes是datetimes,并且不会随意决定18:00:00.000000和18:00:00.000000000是不同的时间...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接