2016-04-28 6 views
0

Ich habe eine Tabelle sessions mit einem Datetime-Feld starts_at. Die starts_at ist in UTC gespeichert, aber ich möchte die Sitzungen sortiert nach Starts_at in Ortszeit und nur als eine Uhrzeit, nicht als Datetime.Verwenden einer Mysql-Funktion in einer Active Record-Order-Klausel

Also, wenn ich Sitzungen mit Datum Zeiten:

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

Ohne Zeitzonen bedenken, dass ich sie in dieser Reihenfolge zurück wollen würde: s2, s1, s3.

Jetzt möchte ich alle utc mal in Ortszeit bekommen, weil wir sagen, dass die Zeitzone tatsächlich 2 Stunden zu utc hinzufügt. Die Reihenfolge von s2, s1, s3 wäre jetzt falsch. Wir würden s3, s2, s1 wollen.

Was ich versucht habe, ist:

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

und

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

Wo tz = Time.now.strftime('%Z') (vorher ich auch Time.now.zone auf die Zeitzone festgelegt, dass alle Die Sitzungen finden statt in)

Leider hat dies mir ungerade Resu gegeben Das scheint in keiner Reihenfolge zu sein.

Antwort

1

hängt davon ab, was Ihre tz ist auf ... vielleicht ist es ungültig .. ich in der Lage war, es zu tun mit explizit Anzahl von Stunden wie diese

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

Vielen Dank! Es sieht so aus, als ob man die Strings "UTC" und "PDT" passierte, das Problem, alles funktionierte, als ich die Stundenzahl überschritt. – xxyyxx

1

So spezifizieren Sie wollen um diese nach Stunde und Minute zu sortieren (das Datum wird ignoriert), aber Sie möchten zuerst in Ihre lokale Zeitzone konvertieren, sodass das erste Element nach Mitternacht (Ortszeit) ist.

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

Sie können die Stunde nach der Konvertierung in Ortszeit extrahieren. Sie können den Minutenabschnitt ohne Konvertierung extrahieren (es sei denn, Sie haben Teilzeitzonen).