我有一张这样的表 -
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
但他们似乎都没有工作。任何建议都会有所帮助
提前致谢。
答案 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;")