Thread: to_char function returning wrong data

to_char function returning wrong data

From
Sreeni Survi
Date:
Hi,

Below code has caused my data to be wiped off a table as my where clause depends on the below returned value.

select to_char(current_date - interval '5 weeks','IYYYWW') ;
201953

If the number of weeks is 4 or 6 or 3 it returns correct value.

select to_char(current_date - interval '4 weeks','IYYYWW') ;   
201901

select to_char(current_date - interval '6 weeks','IYYYWW') ;   
201852

This issue can have a serious effect.

Thanks,
Sreeni

Re: to_char function returning wrong data

From
Andrew Gierth
Date:
>>>>> "Sreeni" == Sreeni Survi <sreenisurvi@gmail.com> writes:

 Sreeni> Hi,
 Sreeni> Below code has caused my data to be wiped off a table as my
 Sreeni> where clause depends on the below returned value.

 Sreeni> *select to_char(current_date - interval '5 weeks','IYYYWW') ;*
 Sreeni> *201953*

That's because IYYY is intended for use with IW, not with WW. The output
is correct, it's the query that's wrong.

There are several different definitions of "week number", and IW is the
ISO week, with IYYY being the corresponding year. So 5 weeks ago, which
was Dec 31st 2018, was ISO week 1 of 2019, but in some other week
numbering systems, it was week 53 of 2018.

-- 
Andrew (irc:RhodiumToad)


Re: to_char function returning wrong data

From
Tom Lane
Date:
Sreeni Survi <sreenisurvi@gmail.com> writes:
> Below code has caused my data to be wiped off a table as my where clause
> depends on the below returned value.

> *select to_char(current_date - interval '5 weeks','IYYYWW') ;*
> *201953*

(For the archives, current_date - interval '5 weeks' is currently
'2018-12-31 00:00:00')

There's nothing wrong with to_char; it did what you told it to.

The problem here is that you're using ISO year numbering along with
non-ISO week numbering.  You should have written 'IYYYIW', which
would give consistent results:

regression=# select to_char(current_date - interval '4 weeks','IYYYIW') ;
 to_char 
---------
 201902
(1 row)

regression=# select to_char(current_date - interval '5 weeks','IYYYIW') ;
 to_char 
---------
 201901
(1 row)

regression=# select to_char(current_date - interval '6 weeks','IYYYIW') ;
 to_char 
---------
 201852
(1 row)

            regards, tom lane