Re: display to_timestamp in quotas or convert to char ?

From: Albe Laurenz <laurenz(dot)albe(at)wien(dot)gv(dot)at>
To: "'czezz *EXTERN*'" <czezz(at)o2(dot)pl>, "pgsql-admin(at)postgresql(dot)org" <pgsql-admin(at)postgresql(dot)org>
Subject: Re: display to_timestamp in quotas or convert to char ?
Date: 2015-05-05 11:46:32
Message-ID: A737B7A37273E048B164557ADEF4A58B365FC46A@ntex2010a.host.magwien.gv.at
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-admin

czezz wrote:
> I have following table in the DB.
>
> Server2=# \d ss21_file
>               Table "srx.ss21_file"
>       Column       |          Type          | Modifiers
> -------------------+------------------------+-----------
> value             | character varying(30)  |
> fileindex         | bigint                 |
> filename          | character varying(80)  |
> filetime          | character varying(100) |
> filesizeinrecords | bigint                 |
> filesizeinbytes   | bigint                 |
> sourceid          | character varying(300) |
> Indexes:
>     "ss21_filetime" UNIQUE, btree (filetime)
>
> When executing following query I get following error:
>
> Server2=# SELECT value, fileIndex, fileName, fileTime, fileSizeInRecords, fileSizeInBytes, sourceID
> FROM ss21_file WHERE filetime < to_timestamp('2015-05-04 22:13:14.000', 'YYYY/MM/DD-HH24:MI:SS.FF3');
> ERROR:  operator does not exist: character varying < timestamp with time zone
> LINE 1: ...ytes, sourceID   FROM ss21_file WHERE filetime < to_times...
>                                                              ^
> HINT:  No operator matches the given name and argument type(s). You might need to add explicit type
> casts.
>
> My assumption is that, it is because "filetime" column is "character varying" and in WHERE condition
> value there is converted to timestamp.

Right. SQL is a typed language, so every expression has a data type.

"filetime" is "character varying", and the result of "to_timestamp" is
"timestamp with time zone":

test=> \df to_timestamp
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+--------------+--------------------------+---------------------+--------
pg_catalog | to_timestamp | timestamp with time zone | double precision | normal
pg_catalog | to_timestamp | timestamp with time zone | text, text | normal

PostgreSQL cannot find an operator "<" with these argument types, even considering
implicit casts (see http://www.postgresql.org/docs/current/static/typeconv-func.html)

> When I execute this same query but instead to_timestamp I use regular string eg. '2015-05-04
> 22:13:14.000' (NOTE: single quotas) it works quite good.

That is because there is a comparison operator "text" < "text".

> If this is correct, is there any way to force to_"timestamp" function to be convertrd in to "character
> varying" or display its value in single quotas ?

You could explicitly case the result of "to_timestamp" to "text", like this:
... WHERE filetime < to_char(to_timestamp(...), '...')

But there are other solutions:

1) Define the "filetime" column as type "timestamp with time zone".
This is normally the best solution.

2) Explicitly cast "filetime" to "timestamp with time zone", like this:
... WHERE to_timestamp(filetime, ...) < to_timestamp(...)
This has the advantage of checking "filetime" for correctness.

Yours,
Laurenz Albe

In response to

Responses

Browse pgsql-admin by date

  From Date Subject
Next Message Scott Ribe 2015-05-05 13:21:25 Re: display to_timestamp in quotas or convert to char ?
Previous Message czezz 2015-05-05 11:26:24 display to_timestamp in quotas or convert to char