我有一个带有日期时间字段starts_at
的表sessions
。starts_at
存储在UTC中,但我希望以本地时间返回按starts_at排序的会话,并将其作为时间,而不是日期时间。
因此,如果我的会话日期时间为:
s1 Jan 1, 13:00
s2 Jan 2, 11:00
s3 Jan 1, 23:00
在不考虑时区的情况下,我希望它们按以下顺序返回:s2, s1, s3
。
现在我想得到当地时间的所有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设置为所有会话将在其中进行的时区)
不幸的是,这给了我奇怪的结果,似乎没有任何顺序。
取决于您的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
因此,您希望按小时和分钟对它们进行排序(忽略日期),但您希望首先转换到本地时区,以便第一项在午夜(本地时间)之后。
Session.order("HOUR(CONVERT_TZ(starts_at, 'UTC', '#{tz}')), MINUTE(starts_at)")
您可以在转换为当地时间后提取小时数。您可以提取分钟部分而无需转换(除非您有分数时区)。