2017-01-24 2 views
2

Ich muß in einer Datenbank (PostgreSQL) ein DiffTime aus der time Bibliothek speichern und drei Optionen zu einem Datenbanktyp konvertieren:Typ zum Speichern von `DiffTime` in Datenbank

  1. Integer mit fromIntegral . fromEnum
  2. numerische über Rational toRational
  3. Echt mit realToFrac

Die ganze Zahl ist genau, aber ziemlich groß, seit gespeichert in Pikosekunden (10^12). Numerisch ist auch genau, aber es ist möglicherweise sehr teuer, ein Rational zu berechnen, da es gcd für Zähler und Nenner berechnen muss. Das Reale ist ungenau, aber vielleicht ist das egal.

Meine Zeit Granularität würde nie unter Minuten oder größer als ein paar Tage sein. Ich muss genaue Berechnungen machen. Geschwindigkeit ist wahrscheinlich kein Problem.

Welche Option sollte ich wählen und was sind die Auswirkungen? Sollte Rational im Allgemeinen vermieden werden, wenn die vom Benutzer übermittelten Nummern behandelt werden, wie in der Bibliothek scientific erläutert?

+0

Beachten Sie, dass 'fromEnum' für Werte, die nicht in ein' Int' passen, auf 0 gekürzt wird. Wenn dieser Bereich groß genug für Sie ist, können Sie auch einfach ein Postgres 'bigint' verwenden. Um ein 'DiffTime' in ein' Integer' zu konvertieren, sollten Sie ['diffTimeToPicoseconds'] (http://hackage.haskell.org/package/time-1.7.0.1/docs/Data-Time-Clock.html#v: diffTimeToPicoseconds). – sjakobi

+0

Danke für die Warnung. Ich habe diese Funktion gesehen, muss aber auch eine Konvertierung für 'NominalDiffTime' durchführen, die keine solche Funktion hat. – Mikkel

Antwort

5

Ich denke, Sie könnten nach interval suchen. Die hasql Bibliothek hat einen Encoder und einen Decoder für DiffTime mit dem Namen interval.

+0

Danke, ich werde mir das ansehen. Habe begonnen, 'hasql' zu verwenden. Irgendwelche Empfehlungen für die Auswahl von Int, Rational oder Float und Rational vs. Scientific? – Mikkel

+0

Ich denke Int und Float sind nicht präzise genug, also gehen Sie wahrscheinlich mit wissenschaftlichen, die schneller und sicherer als rationale afaik sein soll, wenn Sie nicht einfach Intervall verwenden können. – soupi

Verwandte Themen