Datumsformat

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Datumsformat

Re: Datumsformat

von F3K Total » Mi, 26.12.2012 19:24

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

Code: Alles auswählen

.executeupdate
"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

Re: SQL-Befehle mit Parametern

von juetho » Mi, 26.12.2012 19:18

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

von DPunch » Mi, 26.12.2012 19:08

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: Datumsformat

von F3K Total » Mi, 26.12.2012 18:04

Hallo DPunch,
ich lese in deinen Beiträgen immer wieder vom

Code: Alles auswählen

.prepareStatement
Kannst Du erklären, was der Unterschied zum

Code: Alles auswählen

.createStatement
ist, und wo, wenn, der Vorteil liegt?

Beste Grüße von Rik

Re: Datumsformat

von DPunch » Mi, 26.12.2012 17:32

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

von juetho » Mi, 26.12.2012 11:32

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

von F3K Total » Mi, 26.12.2012 09:38

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

von juetho » Mi, 26.12.2012 09:10

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: AW: Datumsformat

von komma4 » Mi, 26.12.2012 06:08

Und dann bitte auch noch die Angaben zur OOo Version, Betriebssystem und Datenbank - gehört zu jeder Frage!

Re: Datumsformat

von lorbass » Mi, 26.12.2012 02:40

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: Datumsformat

von arkadiuszpaluszek » Mi, 26.12.2012 01:42

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

von F3K Total » Mi, 26.12.2012 00:34

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
Date.png (10.11 KiB) 6432 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

Datumsformat

von arkadiuszpaluszek » Mi, 26.12.2012 00:18

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

Nach oben