我正在使用在遗留数据库上运行的Sequel编写Ruby程序。处理不同的日期时间格式存在问题。
DB有一个包含列start_date
的表。在Sequel的迁移脚本中,我将其设置为DateTime
,这是SQLite中的timestamp
类型,但是,旧数据具有不同的时间格式:
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 }
但它不会解决问题,因为数据库有两种不同的日期时间格式。
我的问题是:
注意:该程序不是Rails应用程序。
非常感谢!
答案 0 :(得分:3)
SQLite没有日期/时间类型(请参阅http://sqlite.org/datatype3.html)。它将datetime值存储为字符串。
最佳解决方案是在生产中使用的开发/测试中使用相同的数据库。如果您不想这样做,则需要转换所有SQLite日期时间值,以便它们都使用相同的ISO8601格式。这样比较运算符将正常工作(就像在MySQL中一样)。