Re: to_date() and to_timestamp() with negative years - Mailing list pgsql-general

From Bryn Llewellyn
Subject Re: to_date() and to_timestamp() with negative years
Date
Msg-id 745E3531-6791-4964-AF68-BC82FC2EC864@yugabyte.com
Whole thread Raw
In response to Re: to_date() and to_timestamp() with negative years  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: to_date() and to_timestamp() with negative years  (Adrian Klaver <adrian.klaver@aklaver.com>)
List pgsql-general
> tgl@sss.pgh.pa.us wrote:
>
> Adrian Klaver <adrian.klaver@aklaver.com> writes:
>> Haven't had time to work through what the above is actually doing.
>
> I think the first two are explained by 489c9c340:
>
>    Also, arrange for the combination of a negative year and an
>    explicit "BC" marker to cancel out and produce AD.  This is how
>    the negative-century case works, so it seems sane to do likewise.
>
> The last two look like a parsing issue: with no field separator (nope, the space doesn't count), the code is taking
thedash as a field separator. 

Thanks, Adrian, for trying those tests. So if PG is aiming for one consistent story for years that are less than one,
inall three APIs (to_date() and its cousins, make_timestamp[tz](), and text-to-date-time typecasts), then work still
remains.

The parsing problem seems to be a separable annoyance. I assume that Tom’s "nope, the space doesn't count” is a narrow
commenton this corner of the implementation. It definitely counts here: 

select to_date('12345 01 01', 'YYYY MM DD');

And you have to have some kind of separator between the years substring and the adjacent one(s) even to succeed with
yearsthat have more than four digits. Another usage note stresses that while this is OK: 

select to_date('12340101', 'YYYYMMDD');

this isn't:

select to_date('123450101', 'YYYYMMDD');

and nor is anything else that you might dream up that does not have a separator as mentioned above.

Tom asked about Oracle Database. I have a still-working Version 18.0 in a VM on my laptop. The query can't be so terse
therebecause there's no implicit typecast from date to text. And there's the famous annoyance of "dual". 

I tried this first:

select to_char(to_date('1234/01/01', 'YYYY/MM/DD'), 'YYYY/MM/DD') from dual;

It gets the same output back as the input you gave. So far so good. Then I changed the input to '-1234/01/01'. It
causedthis error: 

ORA-01841: (full) year must be between -4713 and +9999, and not be 0

So it seems that Oracle Database has its own problems. But at least the wording "must… not be 0" is clear—and not what
PGwants to support. 




pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: to_date() and to_timestamp() with negative years
Next
From: Adrian Klaver
Date:
Subject: Re: to_date() and to_timestamp() with negative years