2

Dataset#max日付とタイムスタンプの列 (を使用しますDB[:data].max(:timestamp)が、タイムスタンプや日付ではなく、結果として文字列を取得します。

例:

require 'sequel'
DB = Sequel.sqlite()
#~ DB.use_timestamp_timezones = true #no effect
DB.create_table(:data){
  Fixnum :num
  timestamp :timestamp
  Date :date
} unless DB.table_exists?(:data)

#Insert some testdata
1.upto(10){|i|
  DB[:data].insert(i, Time.now - 24*60*60*i, Date.today - i)
}

#
#my self written max function.
#
def max(ds,field)
    timestamp = nil
    ds.select(field).each{|ds|
      timestamp = ds[field] if ! timestamp or timestamp < ds[field]
    }
    timestamp
end


##Ok
p max(DB[:data],:num)
p DB[:data].max(:num)   #ok

p max(DB[:data],:timestamp)     #timestamp -> ok
p DB[:data].max(:timestamp)     #String!!

p max(DB[:data],:date)     #date -> ok
p DB[:data].max(:date)     #String!!

データが本当にタイムスタンプ/日付である場合、クロスチェックを行いました。これは問題ないようです:

##Crosscheck:
DB[:data].each{|ds|
  puts "Error" unless ds[:timestamp].is_a?(Time)
  puts "Error" unless ds[:date].is_a?(Date)
  puts "Error" unless ds[:num].is_a?(Fixnum)
}

Time#parseタイムスタンプを再度取得するために使用できます。

p Time.parse(DB[:data].max(:timestamp))

しかし、同じタイプで最大値を取得したいと思います。

タイムスタンプ/日付として最大結果を取得する方法はありますか?

4

1 に答える 1

5

いいえ、SQLite には実際には日付型やタイムスタンプ型はありません (http://www.sqlite.org/datatype3.html)。日付列とタイムスタンプ列の ruby​​ の Date 値と Time/DateTime 値を取得する唯一の理由は、Sequel が列の名前付き型 (CREATE TABLE ステートメントで使用される型) を調べ、SQLite が文字列として格納する値を自動的にDate または Time/DateTime。SQLite 式 (max(column) など) は列に関連付けられていないため、Sequel はそのメソッドを型変換に使用できません。

つまり、実際の日付/タイムスタンプ処理が必要な場合は、実際に日付/タイムスタンプ列をサポートするデータベースを使用してください。残念ながら、JDBC 経由で H2/HSQLDB/Derby を使用できる JRuby を使用していない限り、Sequel がサポートする、実際の日付/タイムスタンプ型を持つ組み込みデータベース ライブラリが他にあるとは思えません。

于 2012-05-31T16:42:50.517 に答える