【问题标题】:Dates in sqlite3 database return as nil in Railssqlite3 数据库中的日期在 Rails 中返回为零
【发布时间】:2016-04-13 03:45:41
【问题描述】:

我一直在试图弄清楚如何制作这个问题,以便谷歌会给我一个相关的结果,因为它必须是我所缺少的简单得愚蠢的东西。我使用以下命令创建了一个简单的单表 Rails 应用程序:

rails g scaffold sick name:text sick_day:date shift:text hours:decimal

我运行了rake db:migrate,它工作得很好。然后我在 Firefox 中使用 SQLite Manager 来导入数据。这是 CSV 文件的前三行:

name,sick_day,shift,hours,created_at,updated_at
"Doe, Jane",3/3/2015,C,24,4/12/16,4/12/16
"Smith, John",1/20/2015,C,4,4/12/16,4/12/16
"Smith, John",3/27/2015,C,24,4/12/16,4/12/16

我使用 Excel 插入 created_at 和 updated_at 日期,因为它们是 not_null 字段。它工作得很好。我可以使用 SQLite Manager 浏览数据库并查看所有内容:

但是当我使用 rails 控制台查询数据库时,我得到:

Sick Load (3.2ms)  SELECT  "sicks".* FROM "sicks" LIMIT 3
 => #<ActiveRecord::Relation [
#<Sick name: "Doe, Jane", sick_day: "2015-03-03 00:00:00", shift: "C", hours: 24.0, created_at: "2004-12-16 00:00:00", updated_at: "2004-12-16 00:00:00">, 
#<Sick name: "Smith, John", sick_day: nil, shift: "C", hours: 4.0, created_at: "2004-12-16 00:00:00", updated_at: "2004-12-16 00:00:00">, 
#<Sick name: ""Smith, John", sick_day: nil, shift: "C", hours: 24.0, created_at: "2004-12-16 00:00:00", updated_at: "2004-12-16 00:00:00">]> 

知道为什么我的日期为零吗?它们肯定在数据库中,我不明白为什么它会理解某些日期而不理解其他日期?我错过了什么?

【问题讨论】:

    标签: ruby-on-rails ruby sqlite


    【解决方案1】:

    我修复了它,但它不起作用仍然很奇怪。我尝试将 CSV 文件更改为:

    name,sick_day,shift,hours,created_at,updated_at
    "Doe, Jane",3/3/15,C,24,4/12/16,4/12/16
    "Smith, John",1/20/15,C,4,4/12/16,4/12/16
    "Smith, John",3/27/15,C,24,4/12/16,4/12/16
    

    并重新导入它,但它仍然没有工作。然后我使用 Excel 更改格式并将其转换为格式中的实际文本列:

    name,sick_day,shift,hours,created_at,updated_at
    "Doe, Jane",2015/3/3,C,24,4/12/16,4/12/16
    "Smith, John",2015/1/20,C,4,4/12/16,4/12/16
    "Smith, John",2015/3/27,C,24,4/12/16,4/12/16
    

    并重新导入。现在 Rails 很高兴。 ???

    【讨论】:

    • SQLite 没有任何日期或时间类型,因此它们只是数据库中的字符串 (sqlite.org/datatype3.html#datetime)。您使用的是一种奇怪的格式(即 ISO8601 以外的任何格式),因此在解析日期字符串时有很大的混淆空间。如果您使用 One True Date Format(即 ISO8601 的 YYYY/MM/DD),则不会有歧义或混淆,SQLite 的日期函数甚至可以在字符串上正常工作。
    • 我明白了,这就是我的答案。但即使所有三列都采用 mm/dd/yy 格式,也有两列有效,一列无效。我更喜欢 YYYY/MM/DD,但愚蠢的 Excel 是愚蠢的。哈哈
    • 日期格式不明确,所以 AR 只能猜测字符串的含义,有时它会猜错。或多或少。看看 Rails 对这些 created_at 值的看法,你会发现更多的困惑。在导出或导入过程中将所有日期和时间切换到 ISO8601 确实是唯一明智的做法。
    【解决方案2】:

    sick_day 列与 created_atupdated_at 列之间的格式不匹配。尝试将sick_day 中的年份格式更改为两位数年份,看看是否可行。

    此外,通常最好允许 Rails 为您设置 created_atupdated_at 时间戳。您可以通过编写导入器脚本并使用rails runner(例如)运行它来完成此操作,但这超出了原始问题的范围。

    【讨论】:

    • 您错过了我尝试使用完全相同的格式的部分,但它不起作用。 created_at/updated_at 部分只是因为我将现有的 CSV 文件导入 SQLite 管理器,并且 Rails 已经将这些列设置为 not_null,所以我需要一些东西来填补这些地方。我根本不在乎那些专栏。我的意思是,我使用mm/dd/yy 在文本文件中创建了两列,而现有列的格式相同,但它不起作用。然后我将其更改为mm/dd/yyy,结果相同,最后yyyy/mm/dd 使其工作。
    • 抱歉,我的意思是您在下面我对自己的回答中错过了这一点。
    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多