Datumsformat

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Datumsformat

Beitrag 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
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Datumsformat

Beitrag 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
Date.png (10.11 KiB) 5884 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
Zuletzt geändert von F3K Total am Mi, 26.12.2012 08:06, insgesamt 1-mal geändert.
arkadiuszpaluszek
****
Beiträge: 117
Registriert: So, 09.05.2010 09:53
Wohnort: Coburg
Kontaktdaten:

Re: Datumsformat

Beitrag 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?
Benutzeravatar
lorbass
********
Beiträge: 4116
Registriert: Mo, 01.05.2006 21:29
Wohnort: Bonn

Re: Datumsformat

Beitrag 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
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: AW: Datumsformat

Beitrag von komma4 »

Und dann bitte auch noch die Angaben zur OOo Version, Betriebssystem und Datenbank - gehört zu jeder Frage!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Datumsformat

Beitrag 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
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Datumsformat

Beitrag 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
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Datumsformat

Beitrag 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
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Datumsformat

Beitrag 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
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Datumsformat

Beitrag von F3K Total »

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
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Datumsformat

Beitrag 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.
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: SQL-Befehle mit Parametern

Beitrag 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
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Datumsformat

Beitrag 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

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
Antworten