Seite 1 von 1
Datumsformat
Verfasst: Mi, 26.12.2012 00:18
von arkadiuszpaluszek
Hallo!
Ein Tabellenelement der Datenbank zeigt mir das Datum in unserem europäischen Format, "tt.mm.jj", um das Datum aber als Vergleichswert innerhalb eines SQL - Befehls benutzen zu können muss ich es in das "jjjj-mm-tt" Format umwandeln - einschließlich der Minuszeichen. Habe mir dafür zwar was ewigenes gebastelt, scheint mir aber recht umständlich zu sein - gibt es vielleicht eine Funktion die es tut? Konnte leider in der Literatur nichts finden.
Gruß
Arek
s. auch hier:
http://www.libreoffice-forum.de/viewtop ... 12&t=11418
Re: Datumsformat
Verfasst: Mi, 26.12.2012 00:34
von F3K Total
Hallo Arkadiusz,
du kannst den String direkt aus der DB auslesen, wenn es möglich ist. Das Datum steht hier in der zweiten Spalte der dem Formular zugrundeliegenden Tabelle/Abfrage:
Code: Alles auswählen
Sub get_date
oform = thiscomponent.drawpage.forms.MainForm
sDate = oForm.getstring(2)
msgbox sDate
End Sub
liefert z.B dieses Ergebnis:

- Date.png (10.11 KiB) 6420 mal betrachtet
Wenn Du den Wert vor dem Speichern in die DB aus einem Kontrollelement auslesen und aufbereiten musst, kenne ich auch keine andere Lösung als mit den Funtionen Datevalue/Dateserial/Cdatefromiso/Cdatetoiso/Day(date)/Month(Date)/Year(Date)/Date.day/Date.month/Date.year und Format(Date,"YYYY-MM-DD"), je nachdem welchen Wert (.String,.Text,.date) du aus welchem Kontrollelement (Formular oder Dialog) ausliest.
Gruß R
Re: Datumsformat
Verfasst: Mi, 26.12.2012 01:42
von arkadiuszpaluszek
Was soll das, lieber Gast, zu kritisieren aber nicht mal den Namen anzugeben?
In beiden Foren verkehren unterschiedliche Menschen, in wie vielen unterschiedlichen Foren ich mir Hilfe suche ist wohl meine Sache, oder?
Re: Datumsformat
Verfasst: Mi, 26.12.2012 02:40
von lorbass
Bitte nimm die
Allgemeinen Hinweise zur Forumsbenutzung zur Kenntnis, die du in jeder Kategorie oben in den Bekanntmachungen findest, dort insbesondere den Abschnitt zum Crossposting.
Danke!
lorbass, Mod
Re: AW: Datumsformat
Verfasst: Mi, 26.12.2012 06:08
von komma4
Und dann bitte auch noch die Angaben zur OOo Version, Betriebssystem und Datenbank - gehört zu jeder Frage!
Re: Datumsformat
Verfasst: Mi, 26.12.2012 09:10
von juetho
Zurück zum Thema: Die Antwort von F3K ist nur bedingt richtig. Sie hilft zwar in der Praxis oft, passt aber eigentlich nicht. Wenn die Spalte als DATE oder als DATETIME/TIMESTAMP o.ä. definiert wurde, kann sie in SQL einfach sortiert oder verglichen werden. Es gilt:
Ein DATE ist ein DATE ist ein DATE. Die Darstellung in irgendeiner String-Variante - sei es ein deutsches Format wie tt.mm.jj oder tt.mm.jjjj oder ein englisches wie tt/mm/jjjj oder ein US-Format wie mm/tt/jjjj oder ISO (warum gibt es wohl solch eine Standardisierung?!) - ist immer eine Konvertierung in einen String zur Anzeige, aber nicht zur Verarbeitung vorgesehen (Vergleich, Sortierung).
Es geht also auch direkt zum Vergleich innerhalb eines SQL-Befehls, ggf. unter Verwendung von SQL-Funktionen. So erhält man alle Daten, die in den letzten 30 Tagen neu aufgenommen worden sind:
Code: Alles auswählen
SELECT ID, Inserted -- Datum der Neuaufnahme
FROM xxx
WHERE Inserted >= ADDDATE(current_date, -30) -- hier als MySQL-Funktion
Gruß Jürgen
Re: Datumsformat
Verfasst: Mi, 26.12.2012 09:38
von F3K Total
Guten Morgen Jürgen,
juetho hat geschrieben:Die Antwort von F3K ist nur bedingt richtig.
Es ist mir schon klar, dass man möglichst die SQL-Funktionen verwenden sollte. DateAdd geht mit der embeddet HSQL DB leider nicht.
Wir befinden uns aber im OOo
Basic und Java Forum. Und wie auch Arkadiuz schreibt, kann man ein Datum in einem SQL-Befehl nach meiner Kenntnis von Basic an die interne HSQL DB nur im Format 'YYYY-MM-DD' weiterreichen, z.B.:
Code: Alles auswählen
oconnection = oform.activeconnection
SqlStatement = oconnection.createstatement
sdate = "2012-08-09"
sSql = "Select ""ID"", ""Datum"" from ""Tabelle"" where ""Datum"" <= '"+sdate+"'"
sqlResult = SqlStatement.executequery(sSql)
Wenn Du eine andere Lösung dafür hast, gerne, wäre hochinteressant.
Gruß R
Re: Datumsformat
Verfasst: Mi, 26.12.2012 11:32
von juetho
Hallo R,
stimmt, das Unterforum "Basic" hatte ich zu wenig beachtet. Der Fragesteller wollte "innerhalb eines SQL-Befehls vergleichen", und vor allem darüber wollte ich mich auslassen. Ich hätte auch besser von vornherein nur HSQL-Möglichkeiten nennen sollen, und die sind (Handbuch S. 270 ff.) tatsächlich sehr beschränkt.
Ein paar Varianten, wie in Basic "Datümer" verarbeitet werden können, hatten du, Robert und ich unter
Datum berechnen besprochen. Auf diesem Weg, also über die Inhalte von Kontrollelementen (vor allem Datumsfeld bzw. formatiertem Feld), ist auch das jeweils eingestellte Format (vor allem das Standardformat nach Extras > Optionen) möglich.
Gruß Jürgen
Re: Datumsformat
Verfasst: Mi, 26.12.2012 17:32
von DPunch
Servus
Anstatt sich selber mit Datumsformaten rumzuschlagen, überlasst man sowas lieber dem Datenbanktreiber.
Code: Alles auswählen
nDateColumn = oForm.findColumn("meineDatumsspalte")
myDate = oForm.getDate(nDateColumn)
oConnection = oForm.ActiveConnection
oStatement = oConnection.prepareStatement("SELECT * FROM ""meineTabelle"" WHERE ""meineDatumsspalte"" = ?")
oStatement.setDate(1,myDate)
oResult = oStatement.executeQuery
Re: Datumsformat
Verfasst: Mi, 26.12.2012 18:04
von F3K Total
Hallo DPunch,
ich lese in deinen Beiträgen immer wieder vom
Kannst Du erklären, was der Unterschied zum
ist, und wo, wenn, der Vorteil liegt?
Beste Grüße von Rik
Re: Datumsformat
Verfasst: Mi, 26.12.2012 19:08
von DPunch
Servus
Mal ganz generell:
Wie die
API schon sagt, handelt es sich um ein
precompiled SQL statement
Das bedeutet, dass die SQL-Syntax schon zum Zeitpunkt der Erstellung des PreparedStatements validiert und das Statement kompiliert wird. Daher muss dies beim Ausführen der Abfrage nicht mehr getan werden, was effektiv bei mehrfacher Ausführung des Statements einen Performance-Zuwachs bedeutet. Da dies allerdings von Treiber / DBMS abhgängig ist, würde ich diesen Punkt nicht allzu hoch bewerten.
Für mich viel schwerwiegender:
Fälle wie der hier diskutierte - Du brauchst Dich nicht um Formate kümmern. Mit obigem Codeausschnitt könntest Du einfach so die Datenbank wechseln, auf die Du zugreifst, und der Code würde immer noch funktionieren, selbst wenn die Datenbank das ISO-Format nicht unterstützen würde, ganz einfach weil die Umwandlung in ein konformes Datumsformat direkt vom Treiber übernommen wird (anderes Beispiel: Übergabe von Strings - Hochkommata vs Anführungszeichen).
Mehr Möglichkeiten - einen Binary-Stream (für BLOB-Objekte) z.B. kriegst Du nicht in ein normales Statement.
Die Lesbarkeit des Codes - anstatt jedes Mal einen neuen String zu generieren halte ich das Setzen von Parametern für deutlich übersichtlicher, z.B. folgende imaginäre, aber nicht praxisferne Herangehensweise:
Code: Alles auswählen
oStatement = oConnection.createStatement
For i=0 To 5
sSQL = "UPDATE ""meineTabelle"" SET ""X"" = " & i*10 & " WHERE ""ID"" = " & i
oStatement.executeUpdate(sSQL)
Next i
liest sich in meinen Augen erheblich schlechter als:
Code: Alles auswählen
oStatement = oConnection.prepareStatement("UPDATE ""meineTabelle"" SET ""X"" = ? WHERE ""ID"" = ?")
For i=0 To 5
oStatement.setInt(1,i*10) 'SET X
oStatement.setInt(2,i) 'SET ID
oStatement.executeUpdate
Next i
Zusätzliche Informationen und Vorteile kannst Du auf Seiten wie z.B.
Javarevisited nachlesen.
Re: SQL-Befehle mit Parametern
Verfasst: Mi, 26.12.2012 19:18
von juetho
Danke für diesen wichtigen Hinweis!
SQL-Befehle mit Parametern lesen sich nicht nur besser, sondern vermeiden auch
SQL-Injection und verbessern wesentlich die Sicherheit. Gut, dass es das auch bei OO-Basic gibt; bisher hatte ich keinen derartigen Hinweis gesehen. Jürgen
Re: Datumsformat
Verfasst: Mi, 26.12.2012 19:24
von F3K Total
Hallo DPunch,
vielen Dank dafür, ich werde es ausprobieren. Kann ja nur gut sein!
Kann ich mir das vorbereitete Statement in Version 2 quasi als kompilierte Version von diesem Code vorstellen ...
Code: Alles auswählen
"UPDATE ""meineTabelle"" SET ""X"" = 0 WHERE ""ID"" = 0";
"UPDATE ""meineTabelle"" SET ""X"" = 10 WHERE ""ID"" = 1";
"UPDATE ""meineTabelle"" SET ""X"" = 20 WHERE ""ID"" = 2";
"UPDATE ""meineTabelle"" SET ""X"" = 30 WHERE ""ID"" = 3";
"UPDATE ""meineTabelle"" SET ""X"" = 40 WHERE ""ID"" = 4";
"UPDATE ""meineTabelle"" SET ""X"" = 50 WHERE ""ID"" = 5"
die dann mit einem
"in einem Rutsch" ausgeführt wird?
Edit: Schnickschnack, das .executeUpdate befindet sich in der Schleife, wird also nach jeder Zeile ausgeführt.
Beste Grüße Rik