2016-04-28 67 views
0

我有一個表sessions,日期時間字段爲starts_atstarts_at存儲在UTC中,但是我想在當地時間返回按照starts_at排序的會話,而不是日期時間。在活動記錄訂單子句中使用mysql函數

所以如果我有日期時間會話:

s1 Jan 1, 13:00 
s2 Jan 2, 11:00 
s3 Jan 1, 23:00 

不考慮時間段我希望他們返回順序如下:s2, s1, s3

現在我想在本地時間獲得所有utc時間,因爲可以說時區實際上爲utc增加了2個小時。 s2, s1, s3的順序現在是錯誤的。我們想要s3,s2,s1。

我一直想的是:

Session.order("CONVERT_TZ(starts_at,'UTC', '#{tz}')")

Session.order("TIME(CONVERT_TZ(starts_at,'UTC', '#{tz}'))")

tz = Time.now.strftime('%Z')(這我還設置Time.now.zone的時區,所有的前會議將在)

不幸的是,這給了我奇怪的結果這似乎沒有任何形式的順序。

回答

1

取決於你的TZ設置爲...也許這是無效的.. 我能有這樣的

SELECT *,TIME(starts_at),TIME(CONVERT_TZ(TIME(starts_at),'+00:00', '+2:00')) FROM 
sessions 
ORDER BY TIME(CONVERT_TZ(TIME(starts_at),'+00:00', '+2:00')) 

http://sqlfiddle.com/#!9/1e0ef/8

+0

謝謝!它看起來像傳遞字符串'UTC'和'PDT'是問題,當我通過小時數時,一切正常。 – xxyyxx

1

所以,你要明確指定小時數做按小時和分鐘排序(忽略日期),但您希望先轉換爲當地時區,以便第一個項目在午夜後(當地時間)之後。

Session.order("HOUR(CONVERT_TZ(starts_at, 'UTC', '#{tz}')), MINUTE(starts_at)") 

轉換爲本地時間後可以提取小時。您可以在不轉換的情況下提取分鐘部分(除非您有分數時區)。