Datum im String-Format vergleichen

Molly_Grue

Mitglied
Hallo zusammen :)

Ich habe ein kleines Problem, bei dem Filtern nach einem Datum. Ich arbeite mit Eclipse, Spring und Hibernate, und postgreSQL.

Das Problem ist folgendes. In einer Tabelle wird ein Datum nicht als Timestamp sondern als String eingetragen. Warum das so ist weiß ich leider nicht, denn es geht um ein recht großes Projekt, an dem ich erst seit kurzem mitarbeite. Nun möchte ich aber die Einträge dieser Tabelle auslesen und auf einer Seite im Browser anzeigen und unter anderem nach Datum filtern (zB zeige mir alle Einträge vom 05.10.2007). Dies realisiere ich in einem FormFilter durch
Code:
criteria.add(Restrictions.usw);
Allerdings weiß ich jetzt nicht, wie ich es schaffe, in einem String alle "Daten" rauszufiltern, die zB am 05.10.2007 erstellt wurden, bzw wie ich nach Datum auf- oder absteigend sortieren kann. Mit den "normalen" Methoden klappt das nicht, weil dann ja der 09.11. nach dem 09.10. kommt aber vor dem 10.10. :(

Ich habe auch schon versucht in der getter und setter Methode einfach den String in einen Timestamp bzw. den Timestamp in einen String umzuwandeln aber das klappt auch nicht, da der Interpreter (ich denke der ist das) beim Auslesen (zum Anzeigen im Browser) einen String erwartet, dann erschrickt, weil er einen Timestamp bekommt und eine java.lang.ClassCastException wirft...

Habt ihr einen Tip für mich, wie ich vllt. Daten (ich meine die Mehrzal von Datum ;)) in Stringform "vernünftig" vergleichen kann, also dass der 09.11. nach dem 10.10. kommt? Das wäre echt super!

Liebe Grüße,
Molly
 
Du nimmst dir ein SimpleDataFormat bei dem du entsprechend dem Stringformat in dem du dein Datum hast ein Pattern übergibst. Dann benutzt du die Methode parse um deinen String in ein Date-Objekt umzuwandeln. Date Objekte kannst du mit before oder after entsprechend vergleichen.
 
Ja, das habe ich ja versucht. Aber wenn ich das in der Getter-Methode mache, wird eine Exception geworfen und an einer anderen Stelle, kann ich die Werte zum Filtern, die aus der DB kommen nicht in ein Date umwandeln...
 
Versucht hab ich es folgendermaßen:

Code:
public Timestamp getTaskDate() {
if (!this.taskDate.equals("")) {
   try {
      SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");
      Date date_o = sdf.parse(this.taskDate);
      sdf.applyPattern("dd.MM.yy HH:mm:ss");
      String tmp = sdf.format(date_o);
      Date date_n = sdf.parse(tmp);
      Timestamp ts = new Timestamp(date_n.getTime());
      return ts;
   } catch (java.text.ParseException ex) {
      return null;
   }
   } else {
      return null;
   }
}

Ich hatte zwischen den einzelnen Zeilen schon debug-Ausgaben, und die haben alle so ausgesehen, wie es gedacht war, von dem her bin ich mir sicher, dass der Code an sich richtig ist. Nur wie gesagt, wenn ich es so mache, wird später an der Stelle, an der die Daten ausgelesen werden um sie im Browser anzuzeigen eine Exception geworfen, da ein Timestamp (oder Date) da ankommt, wo ein String hin soll (da ja ein String erwartet wird, weil es in der DB als String abgelegt ist).
 
Versucht hab ich es folgendermaßen:

Code:
public Timestamp getTaskDate() {
if (!this.taskDate.equals("")) {
   try {
      SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");
      Date date_o = sdf.parse(this.taskDate);
      sdf.applyPattern("dd.MM.yy HH:mm:ss");
      String tmp = sdf.format(date_o);
      Date date_n = sdf.parse(tmp);
      Timestamp ts = new Timestamp(date_n.getTime());
      return ts;
   } catch (java.text.ParseException ex) {
      return null;
   }
   } else {
      return null;
   }
}

Ich hatte zwischen den einzelnen Zeilen schon debug-Ausgaben, und die haben alle so ausgesehen, wie es gedacht war, von dem her bin ich mir sicher, dass der Code an sich richtig ist. Nur wie gesagt, wenn ich es so mache, wird später an der Stelle, an der die Daten ausgelesen werden um sie im Browser anzuzeigen eine Exception geworfen, da ein Timestamp (oder Date) da ankommt, wo ein String hin soll (da ja ein String erwartet wird, weil es in der DB als String abgelegt ist).

Ist diese Zeile wirklich so gewollt?
Code:
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy:HH:mm:ss");
müsste es nicht
Code:
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
heißen?
 
Hier gibst du jaauch einen Timestamp zurück und keinen String. Guck dir doch den stacktrace der exception an, da sollte sich doch rausfinden lassen was falsch läuft.
 
@bemar: Jup, diese Zeile soll so aussehen, da der Sting in der Datenbank in diesem Format abgelegt ist (ich weiß auch nicht, warum die da einen ':' dazwischen gemacht haben). Wenn ich jetzt
Code:
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
mache, bekomme ich eine Fehlermeldung weil der String, der aus der Datenbank kommt, nicht das Format hat, welches ich in dem sdf-Objekt vorgebe.

@zeja: Ich weiß, dass ich damit einen Timestamp zurück gebe. Das war ja auch der Versuch, den String in ein Datum zu konvertieren, damit ich vernünftig danach sortieren kann. Aber leider geht das auch nicht, da dann an einer anderen Stelle (auf die ich keinen Einfluss habe, da Hibernate-Quellcode) eine Exception geworfen wird, weil ja ein String und kein Timestamp erwartet wird (weil das Feld in der DB ein "String-Feld" ist).
 
Gibt es in der Datenbank evtl. irgendeine Funktion, die den String mit Formatvorgabe in einen TimeStamp umwandeln kann?
Bei Oracle geht das (toDate glaub ich) - postgreSQL müßtest du mal die dox durchsuchen.
Dann kannst Du auch gleich bei der SQL-Abfrage nach Datum sortieren lassen. ;)

jau gibt es:
zB.
to_timestamp('05 Dec 2000', 'DD Mon YYYY')
 

Neue Beiträge

Zurück