【问题标题】:Using a mysql function in an Active Record order clause在 Active Record 订单子句中使用 mysql 函数
【发布时间】:2016-08-23 21:03:58
【问题描述】:

我有一个表 sessions,其中包含一个日期时间字段 starts_atstarts_at 存储在 UTC 中,但是我想在本地时间返回按starts_at 排序的会话,并且只是作为时间而不是日期时间。

所以如果我的会话日期时间为:

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 设置为所有会话将在其中进行的时区)

不幸的是,这给了我一些奇怪的结果,似乎没有任何顺序。

【问题讨论】:

    标签: mysql ruby-on-rails ruby timezone


    【解决方案1】:

    因此,您希望按小时和分钟对这些内容进行排序(忽略日期),但您希望首先转换为您当地的时区,以便第一项在午夜(当地时间)之后。

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

    您可以在转换为当地时间后提取小时。您可以在不转换的情况下提取分钟部分(除非您有小数时区)。

    【讨论】:

      【解决方案2】:

      取决于您的 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

      【讨论】:

      • 谢谢!看起来传递字符串“UTC”和“PDT”是问题所在,当我传递了小时数时一切正常。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多