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
- Integer mit
fromIntegral . fromEnum
- numerische über Rational
toRational
- 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?
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
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