I have the following
DateFormat dformat = new SimpleDateFormat("yyyy-M-d");
dformat.setLenient(false);
Date cin = dformat.parse(cinDate);
and the sql function
create or replace function search(_checkIn date, _checkOut date) returns setof Bookings as $$
declare
r Bookings;
begin
for r in
select * from Bookings
loop
if ((_checkIn between r.checkIn and r.checkOut) or (_checkOut between r.checkIn and r.checkOut)) then
return next r;
end if;
end loop;
return;
end;
$$ language plpgsql;
The date format for the postgresql is standard (default)
create table Bookings (
id serial,
status bookingStatus not null,
pricePaid money not null,
firstName text,
lastName text,
address text,
creditCard text,
checkOut date not null,
checkIn date not null,
room integer not null,
extraBed boolean not null default false,
foreign key (room) references Rooms(id),
primary key (id)
);
and I’m trying to parse a date into the function so it can return a table for me, I seem to run into the issue of date formatting (which is why I think I’m getting this error)
org.postgresql.util.PSQLException: ERROR: syntax error at or near "Feb"
So I was wondering how would I fix this problem, I don’t know how to format the date properly
EDIT:
I’m calling the query like this
try {
String searchQuery = "SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))";
PreparedStatement ps = conn.prepareStatement(searchQuery);
rs = ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
so I think the error comes in because the way I format the date is wrong and postgres won’t read it
It sounds like you’re passing the argument by concatenating them directly into the string. This is a very bad idea, since it can lead to SQL injections. Always use
PreparedStatements with the?place-holders to pass parameters, never pass them directly by concatening them directly into the query string (more so, you’d need the'delimiters around).You could have something like:
Alternatively, PostgreSQL internal date conversion is usually fairly good and flexible. You could cast the string parameter to a date with PostgreSQL:
This is flexible, but might not lead to the exact result you need depending on the date format (you can check the PostgreSQL manual for details on date conversion formats). The input format you’re using should work just fine, though (Try
SELECT CAST('2012-05-01' AS DATE)directly in PostgreSQL, for example, this will return a correct PostgreSQL date.)Note that when using
new java.sql.Date(cin.getTime()), you’re likely to run into time zone issues. You could usejava.sql.Date.valueOf(...)too.To clarify, following your edit:
This will not work, since the dates would be part of the SQL syntax itself, not strings or dates:
"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"You’d at least need to use
'quotes:. Here, to a degree, you could expect the parameters to be formatted properly, but don’t do it. In addition, would would still have to cast the string using"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))"CAST('...' AS DATE)or'...'::DATE.The simplest way would certainly be:
(As a_horse_with_no_name pointed out in a comment, the general query wouldn’t work anyway because of your inner select.)