【发布时间】:2014-02-09 23:13:26
【问题描述】:
我正在解析一组具有时间戳字符串的 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.807 和 2009-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
);
【问题讨论】:
-
为了在Ruby中表示时间戳,还需要加上
%N来获取毫秒。DateTime.parse('2009-03-08T00:27:31.807').strftime("%F %T.%N") => "2009-03-08 00:27:31.807000000" -
@CBroe 哇,那真是一场灾难,因为我对这些数据所做的任何分析都将不准确。我可以采取哪些步骤?
-
@SeanRedmond 谢谢,看起来现在我们正在捕获它,但正如 CBroe 所说,MySQL 会放弃它。我想知道这方面的最佳做法是什么。我敢打赌我不是第一个看到这个问题的人:)
-
如果您需要小数秒数据,则必须将其存储在单独的列中。