I’m currently trying to store dates in Postgresql that are before ISO8601 ‘year 0’ and am running into issues. Postgresql stores dates internally as JD and can correctly insert/remove dates. I’m storing the date generally as NaiveDateTime and it works fine for anything > year 0.
For instance, the following query works fine in SQL.
sql> insert into table1 set t = '1000-01-01BC 00:00:00';
However, trying to load this in Ecto doesn’t seem to work as we’re referring to a calendar function that doesn’t have any representation of times before 0.
(stdlib 3.13) calendar.erl:257: :calendar.last_day_of_the_month/2
(stdlib 3.13) calendar.erl:133: :calendar.date_to_gregorian_days/3
(stdlib 3.13) calendar.erl:155: :calendar.datetime_to_gregorian_seconds/1
(postgrex 0.15.8) lib/postgrex/extensions/timestamp.ex:48: Postgrex.Extensions.Timestamp.encode_elixir/1
(postgrex 0.15.8) lib/postgrex/type_module.ex:897: Postgrex.DefaultTypes.encode_params/3
(postgrex 0.15.8) lib/postgrex/query.ex:75: DBConnection.Query.Postgrex.Query.encode/3
-spec datetime_to_gregorian_seconds(DateTime) -> Seconds when
DateTime :: datetime(),
Seconds :: non_neg_integer().
datetime_to_gregorian_seconds({Date, Time}) ->
?SECONDS_PER_DAY*date_to_gregorian_days(Date) +
time_to_seconds(Time).
What’s the appropriate way for dealing with this? As far as I know, erlang/elixir doesn’t have any methodology for monkey-patching, the only thing I could think of is to store these dates in an alternative format as a workaround. Any thoughts?