使用续集中提取sqlite3的月/年的时间列(Extracting month/year from

2019-09-22 07:45发布

我有这样一个表 -

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

但他们都不似乎工作。 任何建议将是有益的

提前致谢。

Answer 1:

好。 我终于想通了之后撞头的许多天。

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


文章来源: Extracting month/year from Time Column in sqlite3 using Sequel
标签: sequel