2017-09-16 40 views
0

我有一個與Postgresql作爲默認數據庫的Rails應用程序。我有一個錶帶有兩個日期時間列start_date和end_date的PromotionPipeLine。 時間在數據庫列中以UTC格式保存。我想比較當前時區與保存的列時間,但似乎有一些問題。 我已經定義範圍下面postgresql將utc轉換爲當地時間沒有在軌道上做?

scope :changing_promotion, -> {where("(to_char(start_date At Time zone 'UTC', 'YYYY-MM-DD HH24')='#{(Time.now).strftime('%Y-%m-%d %H')}') or (to_char(end_date At Time zone 'UTC', 'YYYY-MM-DD HH24')='#{(Time.now).strftime('%Y-%m-%d %H')}')")} 

視爲給定的,我稱它在軌道控制檯,

PromotionPipeLine.changing_promotion 

Rails的控制檯顯示我的SQL查詢作爲,

SELECT "promotion_pipe_lines".* FROM "promotion_pipe_lines" WHERE ((to_char(start_date At Time zone 'UTC', 'YYYY-MM-DD HH24')='2017-09-16 15') or (to_char(end_date At Time zone 'UTC', 'YYYY-MM-DD HH24')='2017-09-16 15')) 

,它什麼也不返回 當我在pgAdmin中運行SQL查詢時,它給我預期的記錄。

+0

'Time.now'給出了系統時區的時間這往往是不一樣的'Time.now.utc'。 – max

回答

0

您可以通過使用Postgres own date/time功能,而不是通過從鐵軌傳遞獲取當前時間:

SELECT "promotion_pipe_lines".* 
FROM "promotion_pipe_lines" 
WHERE 
    date_trunc('hour', start_date AT TIME ZONE 'UTC') = date_trunc('hour', current_time AT TIME ZONE 'UTC') 
OR 
date_trunc('hour', end_date AT TIME ZONE 'UTC')) = date_trunc('hour', current_time AT TIME ZONE 'UTC') 

date_trunc('hour', ...截斷一小時的精度。

要適應這一個ActiveRecord的範圍,你會做:

class PromotionPipeLine 

    # `scope` is just syntactic sugar to create class methods 
    # use a regular class method if the defintion does not fit a lambda 
    def self.changing_promotion 
    where(
     SQL <<~ 
     date_trunc('hour', start_date AT TIME ZONE 'UTC') = date_trunc('hour', current_time AT TIME ZONE 'UTC') 
     OR 
     date_trunc('hour', end_date AT TIME ZONE 'UTC')) = date_trunc('hour', current_time AT TIME ZONE 'UTC') 
     SQL 
    ) 
    end 
end 
+0

current_time AT TIME ZONE'UTC''只有在postgres設置爲其他時區時才需要。 – max

相關問題