2

我正在使用在遗留数据库上运行的 Sequel 编写一个 Ruby 程序。处理不同的日期时间格式存在问题。

DB 有一个表,其中有一列start_date。在 Sequel 的迁移脚本中,我将其设置为SQLiteDateTime中的一种timestamp类型,但是,遗留数据具有不同的时间格式:

  • 有些使用 ISO8601,例如2013-09-01T08:28:00+10:00.
  • 有些正在使用不同的,我不知道它是否有名字,比如2013-09-01 08:28:00.000000+1000.

问题是,当我对表运行查询并尝试过滤时start_date,两种日期时间格式之间的差异会导致不正确的结果。

我正在使用的查询是:

current = Time.now
MyModel.where { start_date < current }

Sequel 会将其转换为 SQL,如下所示:

SELECT * FROM `my_model` WHERE `start_date` < '2013-09-01 08:28:00.000000'

从我的本地测试来看,Sequel 看起来像是将日期作为字符串进行比较,因此2013-09-01 08:28:00.000000+1000小于2013-09-01T01:28:00+10:00. 因为空白小于T这不是我想要的。

我可以使用这样的iso8601时间:

current_iso8601 = Time.now.iso8601
MyModel.where { start_date < current_iso8601 }

但它不会解决问题,因为数据库有两种不同的日期时间格式。

我的问题是:

  • Ruby/Sequel 是否支持按日期/时间查询数据库而不是字符串?
  • 它适用于不同的日期时间格式吗?
  • SQLite 仅用于本地测试,在生产中它将是 MySQL。因此,解决方案应该使用通用的 Sequel 方法作为适配器,并且不应该有任何特定于数据库的方法。

注意:该程序不是 Rails 应用程序。

非常感谢!

4

1 回答 1

3

SQLite 没有日期/时间类型(参见http://sqlite.org/datatype3.html)。它将日期时间值存储为字符串。

最好的解决方案是在开发/测试中使用您在生产中使用的相同数据库。如果您不想这样做,则需要转换所有 SQLite 日期时间值,以便它们都使用相同的 ISO8601 格式。这样比较运算符将正常工作(就像它们在 MySQL 中所做的那样)。

于 2013-08-29T16:43:29.570 回答