Datumsformat
Moderator: Moderatoren
-
- ****
- Beiträge: 117
- Registriert: So, 09.05.2010 09:53
- Wohnort: Coburg
- Kontaktdaten:
Datumsformat
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
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
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:
liefert z.B dieses Ergebnis:
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
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
Gruß R
Zuletzt geändert von F3K Total am Mi, 26.12.2012 08:06, insgesamt 1-mal geändert.
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
-
- ****
- Beiträge: 117
- Registriert: So, 09.05.2010 09:53
- Wohnort: Coburg
- Kontaktdaten:
Re: Datumsformat
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?
In beiden Foren verkehren unterschiedliche Menschen, in wie vielen unterschiedlichen Foren ich mir Hilfe suche ist wohl meine Sache, oder?
Re: Datumsformat
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
Danke!
lorbass, Mod
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: AW: Datumsformat
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)
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)
Re: Datumsformat
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:
Gruß Jürgen
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
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Re: Datumsformat
Guten Morgen Jürgen,
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.:
Wenn Du eine andere Lösung dafür hast, gerne, wäre hochinteressant.
Gruß R
Es ist mir schon klar, dass man möglichst die SQL-Funktionen verwenden sollte. DateAdd geht mit der embeddet HSQL DB leider nicht.juetho hat geschrieben:Die Antwort von F3K ist nur bedingt richtig.
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)
Gruß R
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
Re: Datumsformat
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
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
Re: Datumsformat
Servus
Anstatt sich selber mit Datumsformaten rumzuschlagen, überlasst man sowas lieber dem Datenbanktreiber.
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
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
ich lese in deinen Beiträgen immer wieder vom
Code: Alles auswählen
.prepareStatement
Code: Alles auswählen
.createStatement
Beste Grüße von Rik
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
Re: Datumsformat
Servus
Mal ganz generell:
Wie die API schon sagt, handelt es sich um ein
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:
liest sich in meinen Augen erheblich schlechter als:
Zusätzliche Informationen und Vorteile kannst Du auf Seiten wie z.B. Javarevisited nachlesen.
Mal ganz generell:
Wie die API schon sagt, handelt es sich um ein
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.precompiled SQL statement
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
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
Re: SQL-Befehle mit Parametern
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
Re: Datumsformat
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 ...
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
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"
Code: Alles auswählen
.executeupdate
Edit: Schnickschnack, das .executeUpdate befindet sich in der Schleife, wird also nach jeder Zeile ausgeführt.
Beste Grüße Rik
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO