mysql - Ruby:解析时间字符串以在 MySql 中接受为有效的日期时间

标签 mysql ruby

我正在解析一组具有时间戳字符串的 xml 记录。我的最终目标是解析这些记录并将它们放入 mysql 数据库中。我是 ruby​​ 的新手,脚本是通过在线查看其他示例组合在一起的:

这是我的 xml 记录的样子:

  <row Id="253828" UserId="56959" Name="Teacher" Date="2009-03-08T00:27:31.807" />
  <row Id="253829" UserId="22221" Name="Popular Question" Date="2009-03-08T00:32:32.217" />

这是 ruby​​ 方法的样子:

require 'date'

    @st = @my.prepare("insert into badge(id, user_id, name, created) values(?, ?, ?, ?)")
    if element == 'row'
      @st.execute(attributes['Id'], attributes['UserId'], attributes['Name'], DateTime.parse(attributes['Date']).strftime("%F %T"))
    end

但问题是在解析了将近 10,000 条记录后我得到了一个 mysql 错误:

Incorrect datetime value: '2009-03-08 02:02:32' for column 'created' at row 1 (Mysql::Error)

我开始在 repl 中检查这个,这是 repl 的输出:

irb(main):016:0> DateTime.parse('2009-03-08T00:27:31.807').strftime("%F %T")
=> "2009-03-08 00:27:31"
irb(main):017:0> DateTime.parse('2009-03-08T00:32:32.217').strftime("%F %T")
=> "2009-03-08 00:32:32"

如果仔细观察,您会发现原始时间字符串有 2009-03-08T00:27:31.807,而值 807 对转换没有任何影响。因为如果我们将两个时间字符串更改为精确,除了不同的是 . 之后的最后三位数字,那么我觉得转换不正确。我想知道在保持数据完整性的同时将其转换为有效的 mysql 时间戳的最佳方法是什么。

假设,假设时间字符串是 2009-03-08T00:27:31.8072009-03-08T00:27:31.507 在 repl 上尝试这个会给出我们:

irb(main):018:0> DateTime.parse('2009-03-08T00:27:31.807').strftime("%F %T")
=> "2009-03-08 00:27:31"
irb(main):019:0> DateTime.parse('2009-03-08T00:27:31.507').strftime("%F %T")
=> "2009-03-08 00:27:31"

它们都是相同的时间戳,但是它们是吗?

我在 StackExchange 数据库管理部分找到了以下帖子:https://dba.stackexchange.com/questions/48704/mysql-5-6-datetime-incorrect-datetime-value-2013-08-25t1700000000-with-er不确定我是否应该做那样的事情。

从 mysql 方面给出完整的图片:这是我的表的样子:

CREATE TABLE badge
(
    id INT NOT NULL PRIMARY KEY,
    user_id INT NOT NULL,
    name VARCHAR(40) NULL,
    created TIMESTAMP
);

最佳答案

在MySQL中,存储时间信息的分辨率是一秒。您显示的毫秒值( .807 )等无法存储。至于你的 table ,2009-03-08T00:27:31.8072009-03-08T00:27:31.507恰好在同一秒发生。

从 MySQL 5.6.4 版本开始,如果您正确定义列的数据类型,则可以存储小数时间数据。参见 https://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html

您可以通过传递您的 ISO 8601 timestamps 来成功完成此 xml 到 MySQL 的转换过程作为数据库的文本字符串,然后使用具有如下形式的 MySQL 查询进行日期/时间转换:

 INSERT INTO whatever
    ...
  VALUES 
     (..., 
      CAST(STR_TO_DATE( ? ,'%Y-%m-%dT%H:%i:%s.%f') AS DATETIME),    
      ...)

我已经在各种服务器版本上试过了。它似乎是版本证明。

如果您使用的是 5.6.4 之前的 MySQL,并且您需要保持毫秒级,那么您在不久的将来就会感到头疼。您可能会考虑将时间戳记存储为 UNIX 风格的微秒类型的 bigint。您的应用程序代码需要使用 strftime("%Q")获取微秒 UNIX 时间戳。

如果您的任何日期在 1970 年 1 月 1 日之前,这也不起作用。

关于mysql - Ruby:解析时间字符串以在 MySql 中接受为有效的日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21660236/

相关文章:

mysql - crontab 执行 rails 命令

ruby - 在 Ruby 中返回匹配的嵌套数组

ruby-on-rails - 在 ActionController::Base 中替代 url_for

ruby - Chrome 中缺少 session 过期值,但在 Firefox 和 IE 中存在

同一表中不同用户组的mysql数据库架构

MySQL - 连接3个表并将一行作为一列

php - 表名在 MySQL 中显示语法错误

ruby-on-rails - Elasticsearch & Bonsai : IndexMissingException on Heroku, 在本地运行良好

ruby-on-rails - 使用 Rails 构建 Mongo 查询?如何?

mysql - 在 Go 中的 MySQL 中插入行很慢?