我有这样一个表 -
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
但他们都不似乎工作。 任何建议将是有益的
提前致谢。
好。 我终于想通了之后撞头的许多天。
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 +时区
2012-09-12 16:34:31.331394+0530
那么你就麻烦了!
在情况下,你需要时区也编码,你需要将其转换 -
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;")