gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:48:59 25 4
gpt4 key购买 nike

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

非常感谢!

最佳答案

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

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

关于mysql - 在数据库中处理不同的日期时间格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18507126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com