JDBC und Date typ im Format 2005-04-00

JDBC und Date typ im Format 2005-04-00

am 20.12.2005 14:03:53 von Karsten Becker

Moin,
Ich habe eine Spalte in der Tabelle die vom Typen Date ist. Nun gibt es
aber Dates bei denen ich keinen Tag angeben kann. Also gebe ich dort
einfach 2005-04-00 ein. Das funktioniert von PHP aus auch alles prima.
Nur der JDBC Treiber versucht das in ein Date Objekt zu verwandeln, um
es dann wieder in einen String umzuwandeln. Das hat dann zur folge das
wenn ich auf das ResultSet getString aufrufe, ich nicht 2005-04-00
zurückbekomme, sondern 2004-03-31. Das ist aber nicht das was ich
möchte. Mich interessiert es recht herzlich wenig ob dieses Datum als
Date dargestellt werden kann oder nicht, sondern ich will es einfach
nur auslesen, als String bearbeiten und wieder reinstellen. Aber ich
will nicht die Vorteile eines Date typen innerhalb der Datenbank
verlieren. Also z.B. für die Sortierung und Abfrage...

Am allerliebsten wäre mir so etwas wie SELECT CAST(* AS STRING) from
xy

Gruß,
Karsten

Re: JDBC und Date typ im Format 2005-04-00

am 20.12.2005 14:21:08 von Dominik Echterbruch

Karsten Becker wrote:
> Moin,
> Ich habe eine Spalte in der Tabelle die vom Typen Date ist. Nun gibt es
> aber Dates bei denen ich keinen Tag angeben kann. Also gebe ich dort
> einfach 2005-04-00 ein. Das funktioniert von PHP aus auch alles prima.
> Nur der JDBC Treiber versucht das in ein Date Objekt zu verwandeln, um
> es dann wieder in einen String umzuwandeln. Das hat dann zur folge das
> wenn ich auf das ResultSet getString aufrufe, ich nicht 2005-04-00
> zurückbekomme, sondern 2004-03-31. Das ist aber nicht das was ich
> möchte.

Du weißt aber schon, daß das kein Problem von MySQL ist, oder? Außer,
daß MySQL sowas kaputtes wie 2004-04-00 überhaupt als Datum zulässt...
Evtl. kann man dir in einer JDBC-Gruppe genauere Auskunft dazu geben.

> Mich interessiert es recht herzlich wenig ob dieses Datum als
> Date dargestellt werden kann oder nicht, sondern ich will es einfach
> nur auslesen, als String bearbeiten und wieder reinstellen. Aber ich
> will nicht die Vorteile eines Date typen innerhalb der Datenbank
> verlieren. Also z.B. für die Sortierung und Abfrage...

Die Sortierung funktioniert auch als String wunderbar. Du mußt nur für
ein passendes Format sorgen (z.B. YYYY-MM-DD oder YYYYMMDD). Und die
Datumsfunktionen kannst du auch anwenden. Ist zwar nicht ganz so
performant, aber es geht.

> Am allerliebsten wäre mir so etwas wie SELECT CAST(* AS STRING) from
> xy

Hmm... Befrag dazu mal die Doku von MySQL [1]. Von einer solchen
Funktion habe ich noch nichts gehört. Außerdem ist sowas mit Sicherheit
auch von der MySQL-Version abhängig.

[1] http://dev.mysql.com/doc/refman/5.0/en/index.html


Grüße,
Dominik
--
MonstersGame - Die Schlacht zwischen Vampiren und Werwölfen
http://spielwelt6.monstersgame.net/?ac=vid&vid=3018786

Re: JDBC und Date typ im Format 2005-04-00

am 20.12.2005 14:48:41 von Karsten Becker

Dominik Echterbruch schrieb:

> Karsten Becker wrote:
> > Moin,
> > Ich habe eine Spalte in der Tabelle die vom Typen Date ist. Nun gibt es
> > aber Dates bei denen ich keinen Tag angeben kann. Also gebe ich dort
> > einfach 2005-04-00 ein. Das funktioniert von PHP aus auch alles prima.
> > Nur der JDBC Treiber versucht das in ein Date Objekt zu verwandeln, um
> > es dann wieder in einen String umzuwandeln. Das hat dann zur folge das
> > wenn ich auf das ResultSet getString aufrufe, ich nicht 2005-04-00
> > zurückbekomme, sondern 2004-03-31. Das ist aber nicht das was ich
> > möchte.
>
> Du weißt aber schon, daß das kein Problem von MySQL ist, oder? Auße=
r,
> daß MySQL sowas kaputtes wie 2004-04-00 überhaupt als Datum zulässt=
...
> Evtl. kann man dir in einer JDBC-Gruppe genauere Auskunft dazu geben.
Deshalb habe ich ja auch JDBC mit im Subject stehen. Aber ich hab nun
auch mal in einer JDBC Gruppe nachgefragt.
Ich hätte halt erwartet das ich den zurückgelieferten Datentyp per
SQL von Date auf String ändern kann oder so... Und da das dann MySQL
spezifisch wäre, wäre ich dann hier richtig..

>
> > Mich interessiert es recht herzlich wenig ob dieses Datum als
> > Date dargestellt werden kann oder nicht, sondern ich will es einfach
> > nur auslesen, als String bearbeiten und wieder reinstellen. Aber ich
> > will nicht die Vorteile eines Date typen innerhalb der Datenbank
> > verlieren. Also z.B. für die Sortierung und Abfrage...
>
> Die Sortierung funktioniert auch als String wunderbar. Du mußt nur für
> ein passendes Format sorgen (z.B. YYYY-MM-DD oder YYYYMMDD). Und die
> Datumsfunktionen kannst du auch anwenden. Ist zwar nicht ganz so
> performant, aber es geht.
hmm, also nur weil ich 3 mal im Jahr editiere, will ich nicht mio. von
Anfragen in der Performance drosseln....

>
> > Am allerliebsten wäre mir so etwas wie SELECT CAST(* AS STRING) from
> > xy
>
> Hmm... Befrag dazu mal die Doku von MySQL [1]. Von einer solchen
> Funktion habe ich noch nichts gehört. Außerdem ist sowas mit Sicherhe=
it
> auch von der MySQL-Version abhängig.
>
> [1] http://dev.mysql.com/doc/refman/5.0/en/index.html
Naja, slso CAST hab ich ja daher. Was ich mich halt Frage ist wie ich
am intelligentesten eine Date Column als String bekomme.. Und das habe
ich in der Doku leider nicht finden können.

Karsten

Re: JDBC und Date typ im Format 2005-04-00

am 20.12.2005 15:05:50 von Dominik Echterbruch

Karsten Becker wrote:
>>
>>>Ich habe eine Spalte in der Tabelle die vom Typen Date ist. Nun gibt es
>>>aber Dates bei denen ich keinen Tag angeben kann. Also gebe ich dort
>>>einfach 2005-04-00 ein. Das funktioniert von PHP aus auch alles prima.
>>>Nur der JDBC Treiber versucht das in ein Date Objekt zu verwandeln, um
>>>es dann wieder in einen String umzuwandeln. Das hat dann zur folge das
>>>wenn ich auf das ResultSet getString aufrufe, ich nicht 2005-04-00
>>>zurückbekomme, sondern 2004-03-31. Das ist aber nicht das was ich
>>>möchte.
>>
>>Du weißt aber schon, daß das kein Problem von MySQL ist, oder? Außer,
>>daß MySQL sowas kaputtes wie 2004-04-00 überhaupt als Datum zulässt...
>>Evtl. kann man dir in einer JDBC-Gruppe genauere Auskunft dazu geben.
>
> Deshalb habe ich ja auch JDBC mit im Subject stehen. Aber ich hab nun
> auch mal in einer JDBC Gruppe nachgefragt.
> Ich hätte halt erwartet das ich den zurückgelieferten Datentyp per
> SQL von Date auf String ändern kann oder so... Und da das dann MySQL
> spezifisch wäre, wäre ich dann hier richtig..

Daß das geht, weißt du doch (wie unten erwähnt). Warum fragst du dann
noch? Bzw. warum _sagst_ du nicht, daß du weißt, daß das geht?

>>>Mich interessiert es recht herzlich wenig ob dieses Datum als
>>>Date dargestellt werden kann oder nicht, sondern ich will es einfach
>>>nur auslesen, als String bearbeiten und wieder reinstellen. Aber ich
>>>will nicht die Vorteile eines Date typen innerhalb der Datenbank
>>>verlieren. Also z.B. für die Sortierung und Abfrage...
>>
>>Die Sortierung funktioniert auch als String wunderbar. Du mußt nur für
>>ein passendes Format sorgen (z.B. YYYY-MM-DD oder YYYYMMDD). Und die
>>Datumsfunktionen kannst du auch anwenden. Ist zwar nicht ganz so
>>performant, aber es geht.
>
> hmm, also nur weil ich 3 mal im Jahr editiere, will ich nicht mio. von
> Anfragen in der Performance drosseln....

Das ist allerdings eine löbliche Einstellung :)

>>>Am allerliebsten wäre mir so etwas wie SELECT CAST(* AS STRING) from
>>>xy
>>
>>Hmm... Befrag dazu mal die Doku von MySQL [1]. Von einer solchen
>>Funktion habe ich noch nichts gehört. Außerdem ist sowas mit Sicherheit
>>auch von der MySQL-Version abhängig.
>>
>>[1] http://dev.mysql.com/doc/refman/5.0/en/index.html
>
> Naja, slso CAST hab ich ja daher. Was ich mich halt Frage ist wie ich
> am intelligentesten eine Date Column als String bekomme.. Und das habe
> ich in der Doku leider nicht finden können.

OK, was genau hast du denn da nicht verstanden? Du hast die Syntax da
stehen, es sind Beispiele zur Anwendung dabei. So viel Intelligenz, daß
du das auf dein Problem übertragen kannst, traue ich dir schon zu. Also
mußt du ja ein bestimmtes Problem damit haben. Welches?

Oder suchst du vielleicht nach einer Alternative zu CAST()? Da könnte
ich dann DATE_FORMAT() anbieten. Liefert als Ergebnis auch einen String.


Grüße,
Dominik
--
MonstersGame - Die Schlacht zwischen Vampiren und Werwölfen
http://spielwelt6.monstersgame.net/?ac=vid&vid=3018786

Re: JDBC und Date typ im Format 2005-04-00

am 20.12.2005 16:30:42 von Karsten Becker

Dominik Echterbruch schrieb:
> >>>Am allerliebsten wäre mir so etwas wie SELECT CAST(* AS STRING) from
> >>>xy
> >>
> >>Hmm... Befrag dazu mal die Doku von MySQL [1]. Von einer solchen
> >>Funktion habe ich noch nichts gehört. Außerdem ist sowas mit Sicher=
heit
> >>auch von der MySQL-Version abhängig.
> >>
> >>[1] http://dev.mysql.com/doc/refman/5.0/en/index.html
> >
> > Naja, slso CAST hab ich ja daher. Was ich mich halt Frage ist wie ich
> > am intelligentesten eine Date Column als String bekomme.. Und das habe
> > ich in der Doku leider nicht finden können.
>
> OK, was genau hast du denn da nicht verstanden? Du hast die Syntax da
> stehen, es sind Beispiele zur Anwendung dabei. So viel Intelligenz, daß
> du das auf dein Problem übertragen kannst, traue ich dir schon zu. Also
> mußt du ja ein bestimmtes Problem damit haben. Welches?
>
> Oder suchst du vielleicht nach einer Alternative zu CAST()? Da könnte
> ich dann DATE_FORMAT() anbieten. Liefert als Ergebnis auch einen String.
>
Mein Tool soll eigentlich mit beliebigen Queries umgehen können. Und
die haben nunmal die unangenehme eigenschaft das man den Typ der
Ergebnisspalten vorher nicht kennt. Aber ich glaube das ich wohl nicht
darum umherkommen werde das Query zu zerlegen und den Cast manuell
einzufügen.
Aber wirklich glücklich machen tut es mich nicht, weil es eigentlich
eher ein bug im JDBC ist.. Ich hatte gehofft das es eine einfache
Spaltenunabhängige Methode geben würde den String-typen zu
forcieren...

Karsten

Re: JDBC und Date typ im Format 2005-04-00

am 20.12.2005 16:58:54 von Dirk Brosowski

Karsten Becker schrieb:
> Moin,
> Ich habe eine Spalte in der Tabelle die vom Typen Date ist. Nun gibt es
> aber Dates bei denen ich keinen Tag angeben kann. Also gebe ich dort
> einfach 2005-04-00 ein. Das funktioniert von PHP aus auch alles prima.
> Nur der JDBC Treiber versucht das in ein Date Objekt zu verwandeln, um
> es dann wieder in einen String umzuwandeln. Das hat dann zur folge das
> wenn ich auf das ResultSet getString aufrufe, ich nicht 2005-04-00
> zurückbekomme, sondern 2004-03-31. Das ist aber nicht das was ich
> möchte. Mich interessiert es recht herzlich wenig ob dieses Datum als
> Date dargestellt werden kann oder nicht, sondern ich will es einfach
> nur auslesen, als String bearbeiten und wieder reinstellen. Aber ich
> will nicht die Vorteile eines Date typen innerhalb der Datenbank
> verlieren. Also z.B. für die Sortierung und Abfrage...

Das ist kein Datum, also lässt Java die Speicherung in einem Date nicht
zu. Ich finde sogar an der Stelle sollte der JDBC-Treiber eine
SQLException werfen, weil er falsche Daten von der Datenbank bekommt.

Hierbei stellt sich für mich auch die Frage wie du denn überhaupt das
auslesen in Java gestaltest? Du solltest hier also mehr als nur ein
bisserl Text anbieten. Java-Code wäre gefragt, hierzu bist du am besten
in d.c.l.j aufgehoben.

Grüße

Dirk

Re: JDBC und Date typ im Format 2005-04-00

am 20.12.2005 17:00:18 von Dirk Brosowski

Karsten Becker schrieb:
> Dominik Echterbruch schrieb:
>
> Aber wirklich glücklich machen tut es mich nicht, weil es eigentlich
> eher ein bug im JDBC ist.. Ich hatte gehofft das es eine einfache
> Spaltenunabhängige Methode geben würde den String-typen zu
> forcieren...

Ein Bug? Eher hast du ein kaputtes Design ..

Grüße

Dirk

Re: JDBC und Date typ im Format 2005-04-00

am 20.12.2005 21:42:20 von Helmut Chang

Karsten Becker schrieb:

> Ich habe eine Spalte in der Tabelle die vom Typen Date ist. Nun gibt es
> aber Dates bei denen ich keinen Tag angeben kann. Also gebe ich dort
> einfach 2005-04-00 ein.

Du benötigst also nur Jahr und Monat? Dann speichere doch 2005-04-01 und
die Konvention für die Spalte legt fest, dass hier der Monat April des
Jahres 2005 gemeint ist (und nicht der 1. April 2005).

gruss, heli