On 3/11/16, Robert Haas <robertmh...@gmail.com> wrote: > On Sun, Feb 28, 2016 at 9:38 PM, Vitaly Burovoy > <vitaly.buro...@gmail.com> wrote: >>> However, I'm not sure we ought to tinker with the behavior in this >>> area. If YYYY-MM-DD is going to accept things that are not of the >>> format YYYY-MM-DD, and I'd argue that -1-06-01 is not in that format, >> >> It is not about format, it is about values. > > I disagree. In a format like "-1-06-01", you want the first minus to > indicate negation and the other two to be a separator. That's not > very far away from wanting the database to read your mind.
It is not my wish. The database does it just now: postgres=# SELECT to_date('-1-06-01', 'YYYY'); to_date --------------- 0002-01-01 BC (1 row) >> Because it is inconvenient a little. If one value ("-2345") is passed, >> another one ("2346 BC") is got. In the other case a programmer must >> check for negative value, and if so change a sign and add "BC" to the >> format. Moreover the programmer must keep in mind that it is not >> enough to have usual date format "DD/MM/YYYY", because sometimes there >> can be "BC" part. > > Yeah, well, that's life. You can write an alternative function to > construct dates that works the way you like, and that may well be a > good idea. But I think *this* change is not a good idea, and > accordingly I vote we reject this patch. My wish is to make the behavior be consistent. Since there are two reverse functions ("extract" and "to_date" ["to_timestamp" in fact is the same]), I expect that is described as "year" ("year"-"YYYY") means the same thing in both of them, the same with pairs "isoyear"-"IYYY", "dow"-"DDD", "isodow"-"IDDD", etc. Now "year" is _not_ the same as "YYYY" (but it cat be so according to the documentation: there is no mentioning of any ISO standard), whereas "isoyear" _is_ the same: postgres=# SELECT y, to_date(y, 'YYYY')YYYY,to_date(y, 'IYYY')IYYY postgres-# FROM(VALUES('-1-06-01'))t(y); y | yyyy | iyyy ----------+---------------+--------------- -1-06-01 | 0002-01-01 BC | 0002-01-01 BC (1 row) and postgres=# SELECT y, date_part('year', y)YYYY,date_part('isoyear', y)IYYY postgres-# FROM(VALUES('0002-06-01 BC'::date))t(y); y | yyyy | iyyy ---------------+------+------ 0002-06-01 BC | -2 | -1 (1 row) P.S.: proposed patch changes IYYY as well, but it is easy to fix it and I'm ready to do it after finding a consensus. -- Best regards, Vitaly Burovoy -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers