Formatierung Datum für Postgresql
Habe ich Folgendes
DateFormat dformat = new SimpleDateFormat("yyyy-M-d");
dformat.setLenient(false);
Date cin = dformat.parse(cinDate);
und die sql-Funktion
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;
Datum-format für die postgresql ist standardmäßig voreingestellt (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)
);
und ich versuche, um ein Datum zu analysieren, in der Funktion, so dass es zurückgeben kann, eine Tabelle für mich, ich scheine in das Thema der Datums-Formatierung (das ist, warum ich glaube, ich bin immer dieser Fehler)
org.postgresql.util.PSQLException: ERROR: syntax error at or near "Feb"
Also ich Frage mich, wie würde ich dieses problem beheben, ich weiß nicht, wie das Datum zu formatieren, richtig
EDIT:
Rufe ich die Abfrage wie diese
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();
}
also ich denke der Fehler kommt, weil die Art und Weise I-format das Datum ist falsch und postgres nicht Lesen Sie
- Es ist nicht klar, warum Sie brauchen, um das Parsen oder die Formatierung in den ersten Platz. Woher kommt der input kommen, und wie rufst du die Funktion?
- Diese Aussage:
.. where r.id not in (select * from ... )
ist ungültiges SQL. Sie müssen wählen Sie eine einzelne Spalte in der sub-select. - guter Punkt, hatte ich nicht wirklich Lesen Sie die details der Abfrage selbst. Ich habe den Eindruck, etwas könnte besser gemacht werden, ohne die Funktion zu.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es klingt wie Sie übergeben das argument, durch die Verkettung direkt in den string. Dies ist eine sehr schlechte Idee, da kann es zu SQL injections. Immer verwenden Sie
PreparedStatement
s mit der?
Platzhalter für die übergabe von Parametern, nie geben Sie Sie direkt von concatening Sie direkt in den query-string (um so mehr, Sie brauchen den'
Trennzeichen herum).Könnte man etwas wie:
Alternativ PostgreSQL-internen Datum-Konvertierung ist in der Regel ziemlich gut und flexibel. Sie wirken könnte die string-parameter, um ein date mit PostgreSQL:
Dieser ist flexibel, könnte aber nicht dazu führen, dass das genaue Ergebnis Sie brauchen, je nach Datum-format (Sie können den PostgreSQL-Handbuch für details zu Datum-Konvertierung, Formate). Das input-format, die Sie verwenden, sollte funktionieren, ist aber (Versuchen
SELECT CAST('2012-05-01' AS DATE)
direkt in PostgreSQL, zum Beispiel, dies wird die Rückkehr einer richtigen PostgreSQL Datum.)Beachten Sie, dass bei der Verwendung von
new java.sql.Date(cin.getTime())
sind, sind Sie wahrscheinlich zu laufen in Zeit-zone Probleme. Könnten Siejava.sql.Date.valueOf(...)
zu.Zu klären, nach deinem edit:
Wird das nicht funktionieren, da die Termine würde ein Teil der SQL-syntax selbst nicht in die Saiten oder Termine:
"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"
Würden Sie mindestens brauchen, um zu verwenden
'
Zitate:. Hier, zu einem gewissen Grad, man könnte erwarten, dass die Parameter werden korrekt formatiert, aber tun Sie es nicht. Zudem würde würde immer noch wandeln Sie die Zeichenkette mit"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))"
CAST('...' AS DATE)
oder'...'::DATE
.Der einfachste Weg wäre sicherlich:
(Wie a_horse_with_no_name wies in einem Kommentar, die Allgemeine Abfrage würde nicht funktionieren, da eh Ihre innere auswählen.)
Haben Sie schon Hinweise über vorbereitete Anweisungen und das richtige format.
Können Sie auch weitgehend vereinfachen Sie Ihre PostgreSQL-Funktion:
Oder auch:
Schreiben Sie die
LOOP
plus Bedingungen zu einer einfachen SQL-Anweisung, die ist viel schneller.RETURN QUERY
- einfacher und schneller als eine Schleife.Entweder Variante hat seine Vorteile.
Laut auf dieser Seite, das standard-format für Datum - /Uhrzeit-Zeichenfolgen in SQL ist:
Und natürlich für Daten, die Sie verwenden können,
PostgreSQL akzeptiert andere Formate (siehe hier für einige details), aber es gibt keinen Grund, nicht zu bleiben, um die standard.
Jedoch, da Sie immer ein syntax Fehler, es klingt wie Sie sind die Injektion der Datum-strings in der SQL-Anweisung ohne das korrekte quoting/escaping. Doppelklicken Sie überprüfen, dass Sie ordnungsgemäß der Flucht Ihre Eingabe.