2013-12-15 86 views
1

我有一個時間字段在表「時間戳無時區」。當記錄保存到數據庫時,utc時間可能與當地時間不同。但是,我需要按日期對記錄進行分組。因此,我做這樣的事情:導航組由utc日期

result = transmissions.joins(:report).where('reports.time::timestamp::date = ?', record.time.to_date) 

的問題是,如果UTC日期是在不同的日期比本地時間,那麼該記錄中不包括的結果。任何想法如何得到正確的結果?

而且很顯然,我不能改變的「無時區」之一:

Rails database-specific data type

它說: 「得出的結論是,在架構遷移的默認ActiveRecord的日期時間和時間戳列類型不能進行修改,以強制的PostgreSQL與時區一起使用時間戳。「

所以我不知道這樣的事情如何按日期組,因爲顯然是錯誤的:

Unit.where(id: 1100).first.reports.order("DATE(time)").group("DATE(time)").count 
=> {"2013-12-14"=>19, "2013-12-15"=>5} 

返回值是完全錯誤的。所有25條記錄應在2013年12月14日發佈,2013年12月15日發佈0條記錄。

+0

這裏是一篇博客文章,我寫在鐵軌和時區http://jessehouse.com/blog/2013/11/15/working-with-timezones-and-ruby-on-rails/ - 它不包括你的情況,但我想你可能需要使用postgres'在時區'或做分組在紅寶石 – house9

回答

1

假設你的記錄時間戳,與特定的UTC偏移量,你可以嘗試傳遞日期的開始和結束時間的問題在UTC格式查詢:

result = transmissions.joins(:report).where('reports.time >= ? AND reports.time < ?', record.time.midnight.utc, (record.time.midnight + 1.day).utc) 

說明

midnightTime實例上的Rails方法,該方法返回代表原始Time對象的日期午夜的Time對象。同樣,record.time.midnight + 1.day返回代表第二天午夜的Time對象。 然後,轉換都Time對象 - 這是推測時間戳在標準UTC偏移 - 對UTC創建表示午夜到午夜的系統時區UTC格式(以UTC時間的時間段午夜),這正是你想要查詢的內容。

+0

這似乎工作。你能解釋一下「midnight.utc」發生了什麼嗎? – JohnMerlino

+0

當然 - 附上解釋。既然這樣起作用,你會不會認爲upvoting /接受這個問題是正確的? – zeantsoi

0

如何像result = transmissions.joins(:report).where('reports.time >= ? AND reports.time <= ?', record.time.beginning_of_day.utc, record.time.end_of_day.utc)

.utc部分可能沒有必要。