| From: | Steve Crawford <scrawford(at)pinpointresearch(dot)com> | 
|---|---|
| To: | Adrian Klaver <adrian(dot)klaver(at)gmail(dot)com> | 
| Cc: | pgsql-general(at)postgresql(dot)org, marc(at)bloodnok(dot)com | 
| Subject: | Re: Date conversion using day of week | 
| Date: | 2011-03-29 16:02:52 | 
| Message-ID: | 4D9202AC.6020002@pinpointresearch.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-general pgsql-hackers | 
On 03/29/2011 08:50 AM, Adrian Klaver wrote:
> On Tuesday, March 29, 2011 8:33:59 am Steve Crawford wrote:
>> On 03/29/2011 08:07 AM, Marc Munro wrote:
>>> I'm trying to validate a day of the week, and thought that to_date would
>>> do the job for me.  But I found a case where it cannot tell the
>>> difference between sunday and monday.  Is this a bug or intended
>>> behaviour?
>>>
>>> dev=# select to_date('2011-13-Mon', 'YYYY-IW-DY');
>>>
>>>     to_date
>>>
>>> ------------
>>>
>>>    2011-03-28
>> Based on running the queries in 9.0, it's behavior that has been corrected:
>>
>> select to_date('Mon1-13-Tue', 'YYYY-IW-DY');
>> ERROR:  invalid combination of date conventions
>> HINT:  Do not mix Gregorian and ISO week date conventions in a
>> formatting template.
>>
>> Cheers,
>> Steve
>
> Yes and no:)
>
> test(5432)aklaver=>select to_date('2011-13-MON', 'IYYY-IW-DY');
>    to_date
> ------------
>   2011-03-28
> (1 row)
>
> test(5432)aklaver=>select to_date('2011-13-SUN', 'IYYY-IW-DY');
>    to_date
> ------------
>   2011-03-28
> (1 row)
>
>
>
But you changed it to specify an ISO year avoiding the mixed 
conventions. According to the 9.0 docs 
(http://www.postgresql.org/docs/9.0/static/functions-formatting.html)
  "An ISO week date (as distinct from a Gregorian date) can be specified 
to to_timestamp and to_date in one of two ways:
       Year, week, and weekday: for example to_date('2006-42-4', 
'IYYY-IW-ID') returns the date 2006-10-19. If you omit the weekday it is 
assumed to be 1 (Monday).
       Year and day of year: for example to_date('2006-291', 
'IYYY-IDDD') also returns 2006-10-19.
Attempting to construct a date using a mixture of ISO week and Gregorian 
date fields is nonsensical, and will cause an error. In the context of 
an ISO year, the concept of a "month" or "day of month" has no meaning. 
In the context of a Gregorian year, the ISO week has no meaning. Users 
should avoid mixing Gregorian and ISO date specifications. "
So I guess the upshot is that 9.0 throws errors on mixed input, but the 
OP's issues can probably be resolved by explicitly specifying an ISO 
year in the formatting.
Cheers,
Steve
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Andrew Dunstan | 2011-03-29 16:32:13 | Re: foreign data wrappers | 
| Previous Message | Adrian Klaver | 2011-03-29 15:50:56 | Re: Date conversion using day of week | 
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Robert Haas | 2011-03-29 16:04:22 | Re: Replication server timeout patch | 
| Previous Message | Heikki Linnakangas | 2011-03-29 15:54:17 | Re: Problem with streaming replication, backups, and recovery (9.0.x) |