在Active Record order子句中使用mysql函数



我有一个带有日期时间字段starts_at的表sessionsstarts_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)")

您可以在转换为当地时间后提取小时数。您可以提取分钟部分而无需转换(除非您有分数时区)。

相关内容

  • 没有找到相关文章

最新更新