我正在使用在遗留数据库上运行的 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 应用程序。
非常感谢!