ruby-on-rails - PostgreSQL 合并列并转换为具有本地时区的时间戳

标签 ruby-on-rails postgresql ruby-on-rails-4

我正在使用 PostegreSQL 在 Rails 中创建一个时隙表,其中包含如下列

slots    
name | type
-----|-----
day  | date
hour | int
min  | int

小时会像 11, 12, 13, 14 ...

min 可以是 0, 5, 10, 15 ...

我正在尝试使用这三列并创建一个时间戳,以便与 Time.now 进行比较以提取 future 即将到来的记录。

由于 PG 的 to_timestamp 函数使用 UTC 作为默认时区创建时间戳,我想从三列创建时间以使用服务器的时区,我的尝试如下。

Slot.select("
     to_timestamp(
       concat_ws(
         ' ', 
         day::text, 
         concat_ws(
           ':', 
           hour::text, 
           min::text), 
           '#{Time.now.zone}'), 
       'YYYY-MM-DD HH24:MI (TZ)') 
     AS t")

它给了我错误:

PG::FeatureNotSupported:错误:to_date 不支持“TZ”/“tz”/“OF”格式模式

任何建议或想法都会很棒。

谢谢

最佳答案

to_timestamp() 函数返回一个带时区的时间戳 值。如果您没有明确指定时区,则使用服务器的时区。这似乎就是您所需要的全部,因此您可以安全地忘记指定简单日期和时间以外的任何内容。

但是,看看您要做什么,使用 the make_time() function and add the resulting time to the day date to get the timestamp 会容易得多你需要。这为您节省了大量转换为 text 然后返回为 timestamp 的操作:

Slot.select("day + make_time(hour, min, 0.0::float) AS t");

关于ruby-on-rails - PostgreSQL 合并列并转换为具有本地时区的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32981764/

相关文章:

python - 使用 Psycopg2 的 Pandas DataFrame 到 PostgreSQL

ruby - 通过 Rails 控制台获取模型名称会给出不同的结果

ruby-on-rails - 在第 2 行第 8 列的上下文中不允许映射值(Psych::SyntaxError)

ruby-on-rails - 如何根据域名有条件地强制使用 SSL?

ruby-on-rails - 通过实际示例了解 BDD

ruby-on-rails - 活跃商家 Paypal 网关安全 header 无效问题

PostgreSQL:将数据复制到具有不同数据类型的另一列

sql - 唯一约束与唯一索引?

css - AngularJS CSS中CSS选择器&和>是如何使用的

javascript - Rails Strong Params 无法识别通过 Ajax Post 发送的参数