【问题标题】:SQLite/Sequel: Dataset#max returns string for dates and timestampsSQLite/Sequel:Dataset#max 返回日期和时间戳的字符串
【发布时间】:2012-05-31 14:59:12
【问题描述】:

我使用 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))

但我更希望在同一类型中获得最大值。

有没有办法将最大结果作为时间戳/日期?

【问题讨论】:

    标签: ruby sqlite sequel


    【解决方案1】:

    没有。 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 支持的另一个嵌入式数据库库具有真正的日期/时间戳类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2013-07-29
      • 1970-01-01
      相关资源
      最近更新 更多