我使用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))
但我希望在同一类型中获得最大值。
有没有办法将max-result作为时间戳/日期?
答案 0 :(得分:4)
没有。 SQLite实际上没有日期或时间戳类型(http://www.sqlite.org/datatype3.html)。获取日期和时间戳列的ruby Date和Time / DateTime值的唯一原因是Sequel可以查看列的命名类型(在CREATE TABLE语句中使用的那个),并自动将值SQLite存储转换为字符串日期或时间/日期时间。 SQLite表达式(例如max(column))与列无关,因此Sequel不能使用该方法进行类型转换。
简而言之,如果您想要真正的日期/时间戳处理,请使用实际支持日期/时间戳列的数据库。不幸的是,除非你使用JRuby,否则可以通过JDBC使用H2 / HSQLDB / Derby,我不相信Sequel支持的另一个具有真实日期/时间戳类型的嵌入式数据库库。