【问题标题】:SQLite /Rails datetime query problemsSQLite /Rails 日期时间查询问题
【发布时间】:2011-09-25 20:54:30
【问题描述】:

我正在构建一个 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) 后跟“除非订单”。这将生成一个稍微不同的 SQL 查询 - 但不确定它是否能解决您的问题。
  • 它是用这段可怕的代码实例化的:del_datetime = DateTime.parse(offset_datetime.strftime("%Y-%m-%d") + schedule.delivery_time)(我是新手Rails,我相信这个位有更好的选择,但它在我的机器上工作)

标签: ruby-on-rails sqlite


【解决方案1】:

没有答案!以前在 Stack Overflow 上没见过。现在,我通过将数据库字段声明为字符串来“修复”它,然后使用 strftime 确保日期格式保持不变。这可行,但似乎并不理想。

在阅读了 Sqlite 文档中关于数据类型是“错误功能”的所有内容后,我正在考虑将其删除为 Postgres 或类似内容。我希望日期时间是日期时间,并且它不会随机决定 18:00:00.000000 和 18:00:00.000000000 是不同的时间......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2018-08-06
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多