2

我有一张这样的桌子:

db = Sequel.sqlite
db.create_table? :timesheets do
    primary_key :id
    String      :project
    Time        :start
end

我在哪里插入这样的记录:

db[:timesheets].insert(:project => 'AAA', :start  => Time.now)

我将如何从条目中提取“年份”?我尝试了以下方法:

db[:timesheets].select(:strftime.sql_function('%Y', :start)).filter(:id => 1).first
db[:timesheets].select(Sequel.extract(:month, :start)).filter(:id => 1).first
db.fetch("SELECT strftime('%Y', start) FROM timesheets;").first

但它们似乎都不起作用。

4

1 回答 1

3

行。经过几天的头部撞击,我终于弄明白了。

Time.now确实以 SQLite 可以采用的标准化日期格式返回时间值。但是,如果将时区信息编码在其中,它就会变成非标准格式。

也就是说,如果Time.now给你 YYYY-MM-DD HH:MM:SS.SSSSS,那么你没关系:

2012-09-12 16:34:31.331394

但如果它给你类似的东西 YYYY-MM-DD HH:MM:SS.SSSSS +TimeZone

2012-09-12 16:34:31.331394+0530

那么你就有麻烦了。

如果您还需要对 TimeZone 进行编码,则需要对其进行转换:

Time.now.xmlschema

这会给你类似的东西:

2012-09-12T16:40:45+05:30

然后 SQLite 可以智能地解析。

因此,问题中的 INSERT 语句变为:

db[:timesheets].insert(:project => 'AAA', :start  => Time.now.xmlschema)

现在,以下查询可以正常工作:

db[:timesheets].select(:strftime.sql_function('%Y', :start)).filter(:id => 2)
db[:timesheets].select(:start.extract(:month)).filter(:id => 2)
db[:timesheets].fetch("SELECT strftime('%Y', start) FROM timesheets;")
于 2012-09-12T11:24:00.530 回答