2

次のようなテーブルがあります。

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

しかし、それらのどれも機能していないようでした。

4

1 に答える 1

3

Ok。何日も頭をぶつけた後、私はついにそれを理解しました。

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;")
于 2012-09-12T11:24:00.530 に答える