使用Sequel从sqlite3中的Time Column中提取月/年

时间:2012-09-12 07:09:30

标签: sequel

我有一张这样的表 -

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

但他们似乎都没有工作。任何建议都会有所帮助

提前致谢。

1 个答案:

答案 0 :(得分:3)

确定。经过多天的敲击,我终于想通了。

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

也就是说,如果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;")