# Unerwartete Datenbankausgabe bei "select now()" (es wird ein .0 angehängt)



## Tharsonius (14. Jan 2010)

Hallo zusammen,

ich habe ein etwas unschönes Phänomen und weiss nicht woher das kommt. Vielleicht könnt Ihr mir dabei helfen.


Ich habe eine MySQL Datenbank, auf die ich mittels Java zugreife. Als Entwicklungsumgebung verwende ich Eclipse.

Grundlegend sind Verbindungsaufbau und Abfragen gar kein Problem, alles funktioniert so wie es soll.

Einzig die query "SELECT NOW();" bereitet mir Kopfzerbrechen, hier habe ich das Phänomen, dass ich nicht das Ergebnis bekomme, was ich erwarte.

Ich erwarte
'2010-01-14 09:15:18'

Ich bekomme
'2010-01-14 09:15:18.0'


Aus irgend einem Grund bekomme ich an die Sekunden am Ende ein '.0' angehängt, welches ich an dieser Stelle nicht erwarte.
Ich habe unter phpMyAdmin ein select now() auf die selbe Datenbank losgelassen, hier kommt das korrekte Ergebnis.

Ich verwende folgende Methode, um das Datum aus der Datenbank zu lesen:



```
public final class DBHandle
{
[...]

	public final DBAbfrageErgebnis selectFromDataBase(String query, DBDatenTypen[] typen)
	{
		if(open == false)
			return null;
		if(typen.length <= 0)
			return null;
		Statement stmt;
		try
		{
			stmt = con.createStatement();
		}
		catch(SQLException e)
		{
			return null;
		}
		ResultSet rs;
		try
		{
			rs = stmt.executeQuery(query);
		}
		catch(SQLException e)
		{
			try
			{
				stmt.close();
			}
			catch(SQLException f)
			{
				// Nix tun
			}
			return null;
		}
		DBAbfrageErgebnis ergebnis = new DBAbfrageErgebnis();
		try
		{
			while (rs.next())
			{
				ergebnis.neueZeile();
				for (int j = 0; j < typen.length; j++)
				{
					switch (typen[j])
					{
						case LONG:
							ergebnis.addLong(new Long(rs.getLong(j + 1)));
							break;
						case DOUBLE:
							ergebnis.addDouble(new Double(rs.getDouble(j + 1)));
							break;
						case BOOLEAN:
							ergebnis.addBoolean(new Boolean(rs.getBoolean(j + 1)));
							break;
						case STRING:
							ergebnis.addString(rs.getString(j + 1));  // An dieser Stelle wird 
							break;
						default:
							throw new SQLException();
					}
				}
			}
		}
		catch(SQLException e)
		{
			try
			{
				rs.close();
			}
			catch(SQLException f)
			{
				// Nix tun
			}
			try
			{
				stmt.close();
			}
			catch(SQLException f)
			{
				// Nix tun
			}
			return null;
		}
		ergebnis.gefuellt();  // Keiner weiteren Aenderungen am Ergebnis moeglich
		try
		{
			rs.close();
		}
		catch(SQLException e)
		{
			try
			{
				stmt.close();
			}
			catch(SQLException f)
			{
				// Nix tun
			}
			return null;
		}
		try
		{
			stmt.close();
		}
		catch(SQLException e)
		{
			return null;
		}
		return ergebnis;
	}
}
```

Und hier ein Beispielaufruf:
(Für dieses Beispiel gekürzte Fassung)

```
private lese Datum()
{
	DBAbfrageErgebnis ergebnis = dbhandle.selectFromDataBase("SELECT NOW();", DBDatenTypen.STRING);
        System.out.println(ergebnis.getString());
}
```


Ausgabe ist:
2010-01-14 09:15:18.0


Ich habe auch testweise ein
System.out.println(rs.getString(j+1));
in die obere Methode geschrieben. Ausgabe ist dann:

2010-01-14 09:15:18.0
2010-01-14 09:15:18.0


Ich bin für jede Idee dankbar, da ich leider keine Ahnung habe wo ich da noch suchen soll.
Ich kann in der weiterverarbeitenden Funktion das ganze zwar problemlos korrigieren und die .0 rausfiltern aber ich wüsste zuvor halt gerne wo die her kommen.


----------



## Sempah (14. Jan 2010)

Bekommst du das gleiche Ergebnis wenn du direkt auf der DB select now() abfragst oder nur in Verbindung mit deinem Code?


----------



## tfa (14. Jan 2010)

Warum verwandelst du das Datum in einen String? Verwende doch java.sql.TimeStamp oder DateTime. 
Der JDBC-Treiber wandelt das Datumsobjekt eben auf diese Art in einen String um.


----------



## Tharsonius (14. Jan 2010)

@Sempah:
Ich habe nur phpMyAdmin, um auf die Datenbank zuzugreifen, dort habe ich die .0 aber nicht.


@tfa:
Ich brauche das ganze halt als String, aber selbst wenn ich mir mal einen Timestamp ausgeben lasse bekomme ich da die .0 am Ende.

Ich habe im case STRING
einfach mal

```
try
	{
	System.out.println("Stamp: "+rs.getTimestamp(j + 1));
	}
	catch (Exception e) {}
	System.out.println("String: "+rs.getString(j + 1));
```
eingefügt, mit dem Ergebnis, dass ich diese Ausgabe zusätzlich bekomme:

Stamp: 2010-01-14 10:21:09.0
String: 2010-01-14 10:21:09.0

Auch hier ist ein .0 am Ende angehängt.


Wenn ich die Query nun aber abändere in "SELECT LEFT(NOW(),19);"

Dann bekomme ich die Ausgabe:
Stamp: 2010-01-14 10:21:09.0
String: 2010-01-14 10:21:09
2010-01-14 10:21:09


----------



## SlaterB (14. Jan 2010)

klappt das auch um 9.00 morgens? hoffentlich steht dann 09 statt 9 

lies lieber ein Date/ TimeStamp aus, mach irgendwie ein java.util.Date draus und verwende SimpleDateFormat, falls du einen String benötigst


----------



## tfa (14. Jan 2010)

Du kannst dir den Timestamp mit einem Formatter oder DateFormat wie du willst in einen String umwandeln. Das klappt immer mit jeder Datenbank und jedem Treiber in jeder Version.


----------

