处理数据库中的不同日期时间格式?

时间:2013-08-29 09:29:51

标签: mysql ruby sqlite datetime sequel

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

DB有一个包含列start_date的表。在Sequel的迁移脚本中,我将其设置为DateTime,这是SQLite中的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应用程序。

非常感谢!

1 个答案:

答案 0 :(得分:3)

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

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