Re: BUG #13670: DST discrepancy between age() and subtraction for timestamptz arguments

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: BUG #13670: DST discrepancy between age() and subtraction for timestamptz arguments
Дата
Msg-id 6098.1444708186@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: BUG #13670: DST discrepancy between age() and subtraction for timestamptz arguments  (Haribabu Kommi <kommi.haribabu@gmail.com>)
Ответы Re: BUG #13670: DST discrepancy between age() and subtraction for timestamptz arguments  (John Pruitt <jpruitt@doozer.com>)
Список pgsql-bugs
Haribabu Kommi <kommi.haribabu@gmail.com> writes:
> On Tue, Oct 13, 2015 at 1:50 AM, John Pruitt <jpruitt@doozer.com> wrote:
>> Okay, I'll acknowledge that the issue has been discussed before, however I
>> fail to see how the issue can be considered resolved. The function takes
>> time zone aware arguments, ignores that input, and returns plainly incorrect
>> answers - the very definition of a bug.

> I also feel like that it is a bug. Here I attached a patch that
> corrects the problem.

I think you both are fundamentally missing the point.

The age() function exists to provide a "symbolic" difference between two
timestamps.  In its intended use-case, the difference between midnight
on March 1 2015 and midnight on April 1 2015 is one month.  Not one month
plus or minus an hour.

If you want the other behavior, why aren't you using plain timestamp
subtraction?

regression=# select age('1 april 2015'::timestamptz, '1 march 2015'::timestamptz);
  age
-------
 1 mon
(1 row)

regression=# select '1 april 2015'::timestamptz - '1 march 2015'::timestamptz;
     ?column?
------------------
 30 days 23:00:00
(1 row)

(This is based on US DST rules, you might get different results in other
timezones.)

Even discounting any thought of backwards compatibility, it does not seem
to me that erasing the distinction between these behaviors is a good
thing.  People might legitimately want either one.

Another point worth considering is this:

regression=# select '1 march 2015'::timestamptz + age('1 april 2015'::timestamptz, '1 march 2015'::timestamptz);
        ?column?
------------------------
 2015-04-01 00:00:00-04
(1 row)

While I'm not sure that "X + age(Y, X) = Y" holds universally, it does
hold in this example, and the proposed patch would break that.

Having said that, I notice that the seemingly even more obvious
identity "X + (Y - X) = Y" doesn't work in this case.  Maybe we should do
something about that, or maybe not.  My point is mainly that there are
a *lot* of moving parts in this area, as well as a considerable amount
of backwards-compatibility history that we must not take lightly.  It is
well to remember also that civil time and DST laws were written by
politicians who have never heard of mathematical consistency.

            regards, tom lane

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Haribabu Kommi
Дата:
Сообщение: Re: BUG #13670: DST discrepancy between age() and subtraction for timestamptz arguments
Следующее
От: "David G. Johnston"
Дата:
Сообщение: Re: BUG #13674: psql: \i from a script run through \e misparses SQL as \i arguments