Обсуждение: to_date function
Hi
I've a Linux box running postgresql 8.2.17 and facing some strange results from the to_date function.
As you can see in the following tests the problem occurs when the template used includes upper and lower case characters for the minute (Mi or mI).
Am I using the incorrect syntax or is it a bug?
Thank you in advance!
template1=# select to_date('01/04/2013 23:59:59','DD/MM/YYYY HH24:Mi:SS') ;
to_date
------------
2009-04-01
(1 row)
template1=# select to_date('01/04/2013 23:59:59','DD/MM/YYYY HH24:mi:SS')
;
to_date
------------
2013-04-01
(1 row)
template1=# select to_date('01/04/2013 23:59:59','DD/MM/YYYY HH24:mI:SS')
;
to_date
------------
2009-04-01
(1 row)
template1=# select to_date('01/04/2013 23:59:59','DD/MM/YYYY hH24:MI:SS') ;
to_date
------------
2013-04-01
(1 row)
--
Reimer
to_date
------------
2009-04-01
(1 row)
template1=# select to_date('01/04/2013 23:59:59','DD/MM/YYYY HH24:mi:SS')
;
to_date
------------
2013-04-01
(1 row)
template1=# select to_date('01/04/2013 23:59:59','DD/MM/YYYY HH24:mI:SS')
;
to_date
------------
2009-04-01
(1 row)
template1=# select to_date('01/04/2013 23:59:59','DD/MM/YYYY hH24:MI:SS') ;
to_date
------------
2013-04-01
(1 row)
--
Reimer
Carlos Henrique Reimer <carlos.reimer@opendb.com.br> wrote: > I've a Linux box running postgresql 8.2.17 and facing some strange results > from the to_date function. > As you can see in the following tests the problem occurs when the template > used includes upper and lower case characters for the minute (Mi or mI). > Am I using the incorrect syntax or is it a bug? > [...] In general, the template patterns are case-sensitive (cf. "month" vs. "Month" vs. "MONTH"). So "mI" will probably be interpreted as a literal "m" and "I" meaning "last digit of ISO year" which isn't what you want. So use "MI" and be happy. Tim
Carlos Henrique Reimer <carlos.reimer@opendb.com.br> writes:
> I've a Linux box running postgresql 8.2.17 and facing some strange results
> from the to_date function.
> As you can see in the following tests the problem occurs when the template
> used includes upper and lower case characters for the minute (Mi or mI).
> Am I using the incorrect syntax or is it a bug?
The defined template patterns are MI and mi. Random combinations of case
aren't accepted. I believe what's actually happening is that the code
is seeing this as separate letters m (which matches nothing so it's not
a template pattern but just constant text) and i or I, which are the
ISO-week patterns. More recent versions of PG throw an error
ERROR: invalid combination of date conventions
HINT: Do not mix Gregorian and ISO week date conventions in a formatting template.
but 8.2 probably just does something not too sensible with trying to
combine the ISO and Gregorian field values :-(
regards, tom lane
Hi,
on a Windows/PostgrSQL 8.4 three from your queries throw errors (sorry,
but they are in german):
select to_date('01/04/2013 23:59:59','DD/MM/YYYY HH24:Mi:SS');
=> FEHLER: ungültige Kombination von Datumskonventionen
HINT: Die Gregorianische und die ISO-Konvention für Wochendaten können
nicht einer Formatvorlage gemischt werden.
select to_date('01/04/2013 23:59:59','DD/MM/YYYY HH24:mi:SS');
=> 2013-04-01
select to_date('01/04/2013 23:59:59','DD/MM/YYYY HH24:mI:SS');
=> same error as above
select to_date('01/04/2013 23:59:59','DD/MM/YYYY hH24:MI:SS');
=> FEHLER: ungültiger Wert »:5« für »MI«
DETAIL: Der Wert muss eine ganze Zahl sein.
Regards
Ludwig
Am 07.07.2010 23:07, schrieb Carlos Henrique Reimer:
> Hi
> I've a Linux box running postgresql 8.2.17 and facing some strange
> results from the to_date function.
> As you can see in the following tests the problem occurs when the
> template used includes upper and lower case characters for the minute
> (Mi or mI).
> Am I using the incorrect syntax or is it a bug?
> Thank you in advance!
> template1=# select to_date('01/04/2013 23:59:59','DD/MM/YYYY
> HH24:Mi:SS') ;
> to_date
> ------------
> 2009-04-01
> (1 row)
> template1=# select to_date('01/04/2013 23:59:59','DD/MM/YYYY HH24:mi:SS')
> ;
> to_date
> ------------
> 2013-04-01
> (1 row)
> template1=# select to_date('01/04/2013 23:59:59','DD/MM/YYYY HH24:mI:SS')
> ;
> to_date
> ------------
> 2009-04-01
> (1 row)
> template1=# select to_date('01/04/2013 23:59:59','DD/MM/YYYY
> hH24:MI:SS') ;
> to_date
> ------------
> 2013-04-01
> (1 row)
>
> --
> Reimer
>