1

meine Tabelle hat drei Spalten: Datentyp Zeitstempel,Rails 5 Wie spare ich den Unterschied in Stunden und Minuten zwischen zwei Daten in Postgres?

|created_At | final_time| duracion(difference between created at and final_time) 
|   |   | 

die Spalte Differenz die Differenz in Stunden und Minuten sparen soll, in diesem Format HH:

def horario 
    horario.update(duracion: params[:duracion]) // this params is "00:59" 
end 
: MM

dies mein Controller

aber in der Tabelle Horarios, ich habe in Spalte duracion dieses:

2017-12-24 03:59:00 

so will ich 00.59 (59 Minuten) speichern, aber Postgres all aktuelles Datum speichern und 3 Stunden mehr hinzuzufügen. Ich möchte so in der Zukunft speichern ich werde in der Lage sein, Spalte Spalte duracion. Oder sollte ich den Datentyp für diese Spalte ändern? In diesem Fall welchen Datentyp du mir richtest um HH zu speichern: MM ??

danke.

+0

Sie sollten es als Zeichenfolge speichern – Jax

+0

@Jax, später ist es möglich, sie zu summieren? als Zeichenfolge? – matQ

+1

PostgreSQL unterstützt den Standard-SQL-Intervall-Datentyp. Unterstützt Rails das nicht? –

Antwort

0

Sie könnten duracion als Schwimmer-Typen speichern, wo duracion etwas wie final_time entsprechen würde - created_at und dieser Wert wäre die Differenz in Sekunden. Sie können dann mit diesen Werten arithmetisch arbeiten und immer zurück in Minuten, Stunden oder was auch immer Sie benötigen.

0

Rails 5 unterstützt PostgreSQL interval type zu einem gewissen Grad. Sie können interval Spalten in der üblichen Art und Weise erstellen und sie werden richtig in db/schema.rb vertreten sein. Sie können sie auch Werte in der üblichen Weise zuweisen, so dass Sie Dinge wie sagen kann:

model.some_interval = '6 hours' 

und 06:00:00 in der Datenbank erhalten. Allerdings gibt es nichts in Ruby oder Rails, die richtig ein Zeitintervall darstellt (wir haben nur verschiedene Zeitstempel und Datum Klassen) so, wenn das Intervall aus der Datenbank kommt, werden Sie einen String an den Händen haben, das heißt:

> model = Model.find(some_id) 
> model.some_interval.class 
=> String 

so können Sie manuell am Ende zu einem paar Strings in Ruby zu analysieren. Für einfache Intervalle wie '6 hours', wird dies einfach sein, aber es wird mit komplizierten Intervallen wie '6 years 23 days 11 hours' nicht so einfach sein.

Wenn Sie nur mit Ihren Zeitintervallen in der Datenbank arbeiten, dann würde interval natürlich und leicht sein, Sie Dinge wie sagen können:

select some_timestamp + some_interval 

und

where some_timestamp + some_interval < some_other_timestamp 

und alles wird gut funktionieren.

Wenn Sie jedoch mit den Intervallen in Ruby arbeiten müssen, wäre es wahrscheinlich besser, das Intervall als Anzahl von Sekunden in einer Integer-Spalte (oder der gewünschten Auflösung) zu speichern. Dann könnten Sie sagen Dinge wie:

where some_timestamp + (some_interval_in_seconds || 'seconds')::interval < some_other_timestamp 

in der Datenbank und

some_time + model.some_interval_in_seconds 

zurück in Ruby.

In jedem Fall sind Strings wahrscheinlich die falsche Herangehensweise, es sei denn, Sie möchten die Strings überall ständig analysieren.

Verwandte Themen