Hmmm... I didn't know PostgreSQL had a facility for query logging and
debugging of parameters to a logfile. Thought I had to execute a describe
or something like that. Thanks, I'll try it to see what's happening!

2017-02-10 16:57 GMT-05:00 Adrian Klaver <adrian.kla...@aklaver.com>:

> On 02/10/2017 01:51 PM, Roberto Balarezo wrote:
>
>> Hi,
>>
>> The parameter defaultDueDate is a java.sql.Date object, an actual Date.
>> When I run the query with the value in it, it works:
>> ```sql
>> db=> select COALESCE(duedate, date '2017-02-01' + 1) from invoices order
>> by duedate desc;
>>       coalesce
>> ---------------------
>>  2017-02-02 00:00:00
>>  2017-02-02 00:00:00
>>  2016-11-14 00:00:00
>>  2017-02-10 00:00:00
>>  2017-02-02 00:00:00
>>  2017-02-13 00:00:00
>>  2017-02-02 00:00:00
>>  2017-02-02 00:00:00
>> ```
>>
>> But when I send it as a parameter, it ignores it and seems to think the
>> expression is of type interger.
>>
>
> Which would indicate to me that is what is being passed in the parameter.
> If I would guess, from information here:
>
> https://docs.oracle.com/javase/7/docs/api/java/sql/Date.html
>
> milliseconds since January 1, 1970 00:00:00.000 GMT.
>
> Turn on/up logging in Postgres and run a query with that java.sql.Date
> object. I am betting that what you will see in the logs is an integer.
>
>
>
>> 2017-02-10 16:32 GMT-05:00 Adrian Klaver <adrian.kla...@aklaver.com
>> <mailto:adrian.kla...@aklaver.com>>:
>>
>>
>>     On 02/10/2017 07:17 AM, Roberto Balarezo wrote:
>>
>>         Hi, I would like to know why this is happening and some advice
>>         if there
>>         is a way to solve this problem:
>>
>>         I have a query like this:
>>
>>         |select COALESCE(duedate, ? + 1) from invoices order by duedate
>> desc
>>         limit 10; |
>>
>>
>>     What is the 1 in ? + 1 supposed to represent?
>>
>>
>>         where ? is a query parameter. I’m using JDBC to connect to the
>>         database,
>>         and sending parameters like this:
>>
>>         |query.setDate(1, defaultDueDate); |
>>
>>         Where defaultDueDate is a java.sql.Date object. However, when I
>>         try to
>>         execute the query, I get this error:
>>
>>         |org.postgresql.util.PSQLException: ERROR: COALESCE types
>> timestamp
>>         without time zone and integer cannot be matched |
>>
>>
>>     So what is the actual value of defaultDueDate?
>>
>>     Looks like it is an integer from the ERROR message.
>>
>>     Might want to look in the Postgres logs to see if they show anything
>>     that might help.
>>
>>
>>         Why is it inferring that the type is integer, when I send it as
>>         Date??
>>
>>
>>     I don't use Java, but I did find the below, don't know if it helps?:
>>
>>     https://jdbc.postgresql.org/documentation/94/escapes-datetime.html
>>     <https://jdbc.postgresql.org/documentation/94/escapes-datetime.html>
>>
>>
>>
>>         When I force the type using a cast, like this:
>>
>>         |select COALESCE(duedate, CAST(? AS DATE) + 1) from invoices
>>         order by
>>         duedate desc limit 10; |
>>
>>         I get this error:
>>
>>         |org.postgresql.util.PSQLException: ERROR: could not determine
>>         data type
>>         of parameter $1 |
>>
>>         If I’m telling PostgreSQL that the parameter is going to be a
>>         Date, and
>>         send through the driver a Date, why it is having trouble
>>         determining the
>>         datatype of the parameter??
>>         What can I do to make it work?
>>
>>         For reference, I’m using PostgreSQL 9.2.15 and JDBC driver
>>         9.4.1207.jre6.
>>
>>         Thanks for your advice!
>>
>>         ​
>>
>>
>>
>>     --
>>     Adrian Klaver
>>     adrian.kla...@aklaver.com <mailto:adrian.kla...@aklaver.com>
>>
>>
>>
>
> --
> Adrian Klaver
> adrian.kla...@aklaver.com
>

Reply via email to