Re: [PATH] Correct negative/zero year in to_date/to_timestamp
От | Vitaly Burovoy |
---|---|
Тема | Re: [PATH] Correct negative/zero year in to_date/to_timestamp |
Дата | |
Msg-id | CAKOSWNk199hv4RNVArMCWwxSnCiqTSz7LB71o+OhO6UPcT0VAw@mail.gmail.com обсуждение исходный текст |
Ответ на | Re: [PATH] Correct negative/zero year in to_date/to_timestamp (Robert Haas <robertmhaas@gmail.com>) |
Список | pgsql-hackers |
On 3/11/16, Robert Haas <robertmhaas@gmail.com> wrote: > On Sun, Feb 28, 2016 at 9:38 PM, Vitaly Burovoy > <vitaly.burovoy@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
В списке pgsql-hackers по дате отправления: