2016-12-15 14:00 GMT+13:00 David G. Johnston <david.g.johns...@gmail.com>:

> On Wed, Dec 14, 2016 at 5:12 PM, rob stone <floripa...@gmail.com> wrote:
>
>>
>> On Wed, 2016-12-14 at 17:00 -0700, David G. Johnston wrote:
>> > On Wed, Dec 14, 2016 at 4:49 PM, Patrick B <patrickbake...@gmail.com>
>> > wrote:
>> > > ERROR:  function logextract(integer, integer) does not exist
>> > > LINE 1: select logextract(20160901,20161001);
>> > >
>> >
>> > So change the constants you are passing into your function to text
>> > (i.e., surrounding them with single quotes) so it matches the new
>> > function signature.
>> >
>> > There exists an element of understanding the options you are being
>> > given and adapting if something basic like this is overlooked.
>> >
>> > David J.
>>
>>
>> 1) Have you run a \df+ and made sure the function has been created
>> correctly?
>>
>
> ​It was created originally using integer arguments - and thus was being
> called that way.  It was intentionally changed to use "text" arguments per
> a suggestion but without any recognition that the call site needed to
> change as well - hence the error.​  Running \df+ would give the expected
> output.  What could be a problem is if the original function wasn't dropped
> so while the text arg'd one was created the actual call would still
> reference the old int arg'd version and any changes would not appear to
> have been made.
>
>
>> 2) In your first post there is a single apostrophe after the execute
>> instruction. Can't see the closing apostrophe but then my eyesight is
>> not the best.
>>
>
> ​I'd recommend using the "format" function but last time I did that the
> person I way trying to help got mad...​
>
>
>> 3) I've always found it easier to TO_CHAR a date column when using it
>> for comparison purposes.
>>
>
> ​I'm not following this "use text" approach at all...​I get the logistics
> but PostgreSQL allows for comparison of date typed data...
>
> David J.
>
>

I've done:

1. Deleted all the functions;
2. Created a new function:

 CREATE or REPLACE FUNCTION l_extract(date_end text))

RETURNS void AS $$


DECLARE

date_start date := CURRENT_DATE;


begin

  execute '

  COPY

      (

      SELECT

          uuid,

          clientid,

          *

      FROM

          logging

      WHERE

          logtime

      BETWEEN

         ' || date_start || '

      AND

          ' || date_end || '

      )

  TO ''/var/lib/postgresql/'|| date_start ||'_logs.csv''';

end

$$ language 'plpgsql';


3. Calling the function:

select l_extract('20160901');

select l_extract('2016-09-01'); --> doesn't work either


4. Error:

ERROR:  operator does not exist: timestamp without time zone >= integer

LINE 13:                 BETWEEN

                         ^

HINT:  No operator matches the given name and argument type(s). You might
need to add explicit type casts.

QUERY:

  COPY

      (

      SELECT

          uuid,

          clientid,

          *

      FROM

          logging

      WHERE

          logtime

      BETWEEN

        2016-12-15

      AND

          20160901

      )

  TO '/var/lib/postgresql/2016-12-15_logs.csv'

CONTEXT:  PL/pgSQL function iknock_log_extract(text) line 7 at EXECUTE


5. \d+ logging:

log_time           | timestamp(3) without time zone


6. Query below works:

      SELECT

          uuid,

          clientid,

          *

      FROM

          logging

      WHERE

          logtime

      BETWEEN

         '2016-12-15'

      AND

          '20160901'


Still can't understand what's going on =\

Reply via email to