2012-09-12 30 views
2

在sqlite3的从时间列中提取月/年我有一个这样的表格 -使用续集

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 

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

在此先感谢。

回答

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 

那么你就麻烦了!

在情况下,你需要时区也编码,你需要将其转换 -

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;") 
+1

好找。由于[iso8601](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/time/rdoc/Time.html#method-c-iso8601)是xmlschema的别名,我想我可能更喜欢在生产代码中查看'Time.now.iso8601'。我认为大多数处理时间的程序员都知道ISO 8601与时间格式有关。在这种情况下看到“xmlschema”有点令人惊讶,我可能会停下来查看它。 –