sec_to_time buggy?
am 18.12.2006 17:24:37 von Martin Ernst
Hallo, ich habe folgende einwandfrei funktionierende Abfrage:
select
month(sz.datum),
'Name',
SUM(time_to_sec(sz.bis) - time_to_sec(sz.von)) as stunden
from
adr_kunden,
stundenzettel as sz,
projects
where
sz.projekt=3Dprojects.ID
and projects.kd_ID in (10, 238, 239, 240)
and adr_kunden.ID =3D projects.kd_ID
and sz.datum between '20060101000000' and '20061231235959'
group by month(sz.datum)
Aus meiner Datenbank wird mir damit ein Auszug erstellt, wie viele
Stunden ich für einen bestimmten Kunden tätig war, Gruppiert und
kumuliert nach Monaten. Die Ausgabe erfolgt in Sekunden, was nicht so
toll ist. Also füge ich in zeile 4 ein sec_to_time( ... ) ein, was
dann aber einen Fehler verursacht:
"#1064 - You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use
near '( SUM( time_to_sec( sz . bis ) - time_to_sec( sz . von ) ) ) as"
(Fehlermeldung ausgegeben in phpMyAdmin).
Das verstehe ich nicht. Ich verwende MySQL 4.1.9 auf einem NT-Server.
Vielen Dank für Hinweise
Martin
Re: sec_to_time buggy?
am 18.12.2006 17:39:01 von Christian Hammers
On 2006-12-18 Martin Ernst wrote:
....
> Also füge ich in zeile 4 ein sec_to_time( ... ) ein, was
> dann aber einen Fehler verursacht:
>=20
> "#1064 - You have an error in your SQL syntax; check the manual that
> corresponds to your MySQL server version for the right syntax to use
> near '( SUM( time_to_sec( sz . bis ) - time_to_sec( sz . von ) ) ) as"
> (Fehlermeldung ausgegeben in phpMyAdmin).
Du hast sicherlich das abschließende Komma nach 'stunden' in Zeile 3
vergessen, wenn Du in der neuen Zeile 4 eine Fehlermeldung bekommst! *g*
tschüss,
-christian-
Re: sec_to_time buggy?
am 18.12.2006 17:51:07 von Martin Ernst
On 18 Dez., 17:39, Christian Hammers wrote:
> Du hast sicherlich das abschließende Komma nach 'stunden' in Zeile 3
> vergessen, wenn Du in der neuen Zeile 4 eine Fehlermeldung bekommst! *g*
Hm, warum sollte ich nach der letzten Auswahl vor dem FROM ein Komma
setzen? Ich habe es sicherheitshalber natürlich ausprobiert, aber ohne
Erfolg.
Seltsam ist auch folgendes: PhpMyAdmin formatiert mir die fehlerhafte
Anweisung ein wenig, auch mit farblicher Kennzeichnung. Die bekannten
Funktionen werden versal und rot ausgegeben, sec_to_time allerdings
nicht.
Martin
Re: sec_to_time buggy?
am 18.12.2006 18:59:45 von Christian Hammers
On 2006-12-18 Martin Ernst wrote:
> On 18 Dez., 17:39, Christian Hammers wrote:
> > Du hast sicherlich das abschließende Komma nach 'stunden' in Zeile 3
> > vergessen, wenn Du in der neuen Zeile 4 eine Fehlermeldung bekommst! *g*
>=20
> Hm, warum sollte ich nach der letzten Auswahl vor dem FROM ein Komma
> setzen? Ich habe es sicherheitshalber natürlich ausprobiert, aber ohne
> Erfolg.
Ich schrieb ja auch Zeile 3 also die davor! :) Poste mal das komplette
Query so wie es nicht funktioniert und dazu eine passendes CREATE TABLE
damit wir es ohne großen Aufwand reproduzieren können.
tschüss,
-christian-
Re: sec_to_time buggy?
am 19.12.2006 10:39:38 von Martin Ernst
Funktioniert einwandfrei:
01 select
02 month(sz.datum),
03 'Name',
04 SUM(time_to_sec(sz.bis) - time_to_sec(sz.von)) as stunden
05 from
06 adr_kunden,
07 stundenzettel as sz,
08 projects
09 where
10 sz.projekt=3Dprojects.ID
11 and projects.kd_ID in (10, 238, 239, 240)
12 and adr_kunden.ID =3D projects.kd_ID
13 and sz.datum between '20060101000000' and '20061231235959'
14 group by month(sz.datum)
Es ist Zeile 4, die mit Stunden endet. Und ich habe nirgends ein ","
vergessen. Das nur, damit wir uns um das eigentlich Problem kümmern
können ;)
Martin
Re: sec_to_time buggy?
am 19.12.2006 11:09:26 von Axel Schwenke
"Martin Ernst" wrote:
> Hallo, ich habe folgende einwandfrei funktionierende Abfrage:
>
> select
> month(sz.datum),
> 'Name',
> SUM(time_to_sec(sz.bis) - time_to_sec(sz.von)) as stunden
> from
> adr_kunden,
> stundenzettel as sz,
> projects
> where
> sz.projekt=projects.ID
> and projects.kd_ID in (10, 238, 239, 240)
> and adr_kunden.ID = projects.kd_ID
> and sz.datum between '20060101000000' and '20061231235959'
> group by month(sz.datum)
Darf man fragen, warum du das String-Literal 'Name' abfragst?
Und warum du überhaupt mit adr_kunden JOINst?
> Aus meiner Datenbank wird mir damit ein Auszug erstellt, wie viele
> Stunden ich für einen bestimmten Kunden tätig war, Gruppiert und
> kumuliert nach Monaten. Die Ausgabe erfolgt in Sekunden, was nicht so
> toll ist. Also füge ich in zeile 4 ein sec_to_time( ... ) ein, was
> dann aber einen Fehler verursacht:
>
> "#1064 - You have an error in your SQL syntax; check the manual that
> corresponds to your MySQL server version for the right syntax to use
> near '( SUM( time_to_sec( sz . bis ) - time_to_sec( sz . von ) ) ) as"
Ich sehe hier deutlich mehr Leerzeichen als ich erwarten würde, wenn
ich mir zu obiger Query noch ein sec_to_time() dazu denke.
Ist es eigentlich zuviel verlangt, daß du die *exakte* Query hier per
Copy&Paste reinstellst?
> (Fehlermeldung ausgegeben in phpMyAdmin).
Das könnte ein Teil des Problems sein. Wenn phpMyAdmin die Leerzeichen
in die Query gebosselt hat, hat es vielleicht noch mehr zerbröselt.
Nimm also den Kommandozeilenclient von MySQL und tippe (bzw. paste)
deine Query da rein. Ich tippe 10:1 daß es dann geht.
XL
Re: sec_to_time buggy?
am 19.12.2006 11:42:47 von Martin Ernst
Es ist nicht zu viel verlangt. Das ist genau das, was ich gemacht habe.
Copy & Paste meiner Abfrage, die ich an den Server gestellt habe. Bzw.
mit sec_to_time dann:
select
month(sz.datum),
'AH Hermann',
sec_to_time(SUM(time_to_sec(sz.bis) - time_to_sec(sz.von))) as
stunden
from
adr_kunden,
stundenzettel as sz,
projects
where
sz.projekt=projects.ID
and projects.kd_ID in (10, 238, 239, 240)
and adr_kunden.ID = projects.kd_ID
and sz.datum between '20050101000000' and '20051031235959'
group by month(sz.datum)
Re: sec_to_time buggy?
am 19.12.2006 11:52:42 von Martin Kaffanke
Am Tue, 19 Dec 2006 02:42:47 -0800 schrieb Martin Ernst:
> Es ist nicht zu viel verlangt. Das ist genau das, was ich gemacht habe.
> Copy & Paste meiner Abfrage, die ich an den Server gestellt habe. Bzw.
> mit sec_to_time dann:
>
> select
> month(sz.datum),
> 'AH Hermann',
> sec_to_time(SUM(time_to_sec(sz.bis) - time_to_sec(sz.von))) as
> stunden
> from
> adr_kunden,
> stundenzettel as sz,
> projects
> where
> sz.projekt=projects.ID
> and projects.kd_ID in (10, 238, 239, 240)
> and adr_kunden.ID = projects.kd_ID
> and sz.datum between '20050101000000' and '20051031235959'
> group by month(sz.datum)
Ok, also dann musst du noch ausschlieÃen, dass phpmyadmin das Problem
verursacht. Denn die Fehlermeldung weist hier einen syntax error auf, das
heiÃt du müsstest Begründen warum deine Syntax lt. Dokumentation
richtig ist, (und das ist die in der Fehlermeldung angegebene durch die
Menge an Leerzeichen vor allem bei 'sz . bis' schlichtweg nicht).
Bei einem typischen Bug müsste entweder einen anderen Fehler werfen,
sowas wie 'konnte Sekunden nicht in Zeit umwandeln', oder ein Ergebnis
liefern, welches schlichtweg falsch ist.
lg,
Martin
Re: sec_to_time buggy?
am 19.12.2006 12:22:50 von Claus Reibenstein
Martin Ernst schrieb:
> Funktioniert einwandfrei:
>
> 01 select
> 02 month(sz.datum),
> 03 'Name',
Feldnamen gehören entweder in Backticks (`Name`) oder doppelte
Anführungsstriche ("Name").
Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /
Re: sec_to_time buggy?
am 19.12.2006 13:23:33 von Claus Reibenstein
Martin Ernst schrieb:
> Funktioniert einwandfrei:
Gefragt war aber nach dem Query, welches _nicht_ funktioniert!
> 01 select
> 02 month(sz.datum),
> 03 'Name',
Datenbank-, Tabellen- und Spaltennamen gehören entweder in Backticks
(`Name`) oder doppelte Anführungsstriche ("Name").
Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /
Re: sec_to_time buggy?
am 19.12.2006 13:28:39 von Martin Ernst
> Datenbank-, Tabellen- und Spaltennamen gehören entweder in Backticks
> (`Name`) oder doppelte Anführungsstriche ("Name").
Oder ganz ohne, so wie ich es mache.
Name steht in einfachen Anführungszeichen, weil es sich um eine
konstante Zeichenkette handelt.
Ich nehme jetzt mal die von phpMyAdmin als fehlerhaft ausgegebene
Anweisung und setze die erneut ab. mal sehen, was dabei rauskommt.
Moment mal, das ist ja Blödsinn ...
Re: sec_to_time buggy?
am 19.12.2006 13:43:06 von Martin Ernst
> Moment mal, das ist ja Blödsinn ...
Blödsinn hin und her, ich habe es trotzdem mal gemacht. Die als
fehlerhaft bemängelte Abfrage kopiert, ins SQL-Fenster eingefügt und
siehe da: funktioniert. Einziger Unterschied: phpMyAdmin fügt am Ende
ein LIMIT 0, 30 ein. Sobald ich das wieder wegnehme, bekomme ich den
Fehler.
Obwohl ich mir nicht erklären kann, weshalb der Mangel der Limitierung
den Fejler aufwerfen sollte ...
Danke für eure Geduld
Martin
Re: sec_to_time buggy?
am 19.12.2006 14:26:09 von Claus Reibenstein
Martin Ernst schrieb:
>> Datenbank-, Tabellen- und Spaltennamen gehören entweder in Backticks
>> (`Name`) oder doppelte Anführungsstriche ("Name").
>
> Oder ganz ohne, so wie ich es mache.
Das geht aber nur, wenn der Name nicht mit einem Schlüsselwort
übereinstimmt.
> Name steht in einfachen Anführungszeichen, weil es sich um eine
> konstante Zeichenkette handelt.
Und welchen Sinn soll das haben?
Gruß. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /
Re: sec_to_time buggy?
am 20.12.2006 09:11:17 von Martin Ernst
>> Name steht in einfachen Anführungszeichen, weil es sich um eine
>> konstante Zeichenkette handelt.
> Und welchen Sinn soll das haben?
Ja, das habe ich inzwischen auch bemerkt und habe es eliminiert. Aber
das hat auch nicht zur Änderung der Situation geführt.
Martin