I have been chasing a bug for a bit now. I even wound up completely rewriting the function, which in the end turns out to be a good thing, as it is much cleaner and easy to read. I now believe that the bug is in how I am using an input parameter to the function. Here is the function deceleration: CREATE FUNCTION return_previous_month_start_and_end( integer) RETURNS interval_dates AS $$ Here is one of the places I am using it: my_year := ( select cast(extract(year from cast(date_trunc('month', CURRENT_DATE) - interval ' $1 month - 1 ' day as date) ) as integer) ) ; This prints the correct value BTW: RAISE notice 'Called with %', $1 ; Nay thoughts as to what I am doing wrong? -- "They that would give up essential liberty for temporary safety deserve neither liberty nor safety." -- Benjamin Franklin