【问题标题】:Compare only the times of two timestamps in postgres仅比较 postgres 中两个时间戳的时间
【发布时间】:2013-12-10 17:27:12
【问题描述】:

在 PostgreSQL 中,我需要一种方法来确定当前时间是否在具有 opens_at 和 closes_at 时间戳的某个模型的运行小时内。这样做的有效 Postgres 方式是什么。

对于 Sqlite3 我有:

                        (opens_at > closes_at AND
                        (TIME(opens_at) > :now OR :now < TIME(closes_at)))
                        OR
                        (closes_at > opens_at AND
                        (TIME(opens_at) < :now AND TIME(closes_at) > :now))

我忘了提到这是通过ActiveRecord 运行所以:now 实际上等于当前的UTC 时间。

【问题讨论】:

    标签: sql postgresql rails-activerecord rails-postgresql


    【解决方案1】:

    可能最简单的做法是将timestamps 转换为times 并使用localtime

    opens_at::time > localtime or localtime < closes_at::time
    ...
    

    Rails 将在数据库中以 UTC 格式保存所有内容(包括数据库连接),因此您不必担心时区问题。

    【讨论】:

    • 将转换为 time 确保只考虑一天中的时间,不考虑日期。我不在乎日期,只在乎时间。
    • 来自精品手册:"time: time of day (no date)".
    • 你粉碎它。谢谢!
    • @muistooshort 这个答案太棒了!它也帮助了我。但不像你说的,我不会对UTC有问题,情况就是这样。对于生活在 UTC+02:00 的我来说,当我定义开放时间减去 2 小时时,以下检查才是正确的: where("opens::time = localtime") 。任何?您知道该怎么做才能让我的支票生效吗?
    • @MichaelL。 opens 是什么类型?数据库在哪个时区?
    猜你喜欢
    • 2012-02-04
    • 2015-01-02
    • 2019-02-27
    • 2017-07-10
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多