Durschnittswert aus nvarchar(50) erstellen

mgross93

Benutzer
Beiträge
5
Guten Morgen :),
habe folgendes Problem...

Es wurde vor Jahren einmal der Fehler gemacht in einer Datenbank die Dauer eines Ereignisses in ein nvarchar(50) Datentyp zu schreiben (Jetzt recht sich das!).

Es geht darum über eine VB.NET Applikation gegen die MSSQL Datenbank einen SQL-Befehl zu schießen der mir den Durschnittswert der Dauer eines Monates zurückgibt.

Tabelle:
ID(Auto. INT)|Datum(date)|Uhrzeit(time(7)|Dauer(nvarchar(50))|
--------------------------------
1 |2013-05-26 | 18:50:00 | 00:00:58
2 |2013-05-27 | 16:05:00 | 00:02:04
...

Ich scheitere daran die Dauer so zu konvertieren, damit ich den durschnitt aus dem Monat berechnen kann.

Momentaner code
SELECT cast(month(Datum) AS varchar(50)) + '.' + cast(year(Datum) AS varchar(50)) AS Datum, cast(Dauer AS time) AS Dauer FROM Call WHERE Datum BETWEEN '25.05.2013' AND '01.08.2013' AND (Firmen_ID=4 OR Firmen_ID=5 OR Firmen_ID=6) GROUP BY cast(month(Datum) AS varchar(50)) + '.' + cast(year(Datum) AS varchar(50)), Dauer ORDER BY DATUM


Vielen dank für Eure Hilfe :)
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.846
Guten Morgen :),
habe folgendes Problem...

Es wurde vor Jahren einmal der Fehler gemacht in einer Datenbank die Dauer eines Ereignisses in ein nvarchar(50) Datentyp zu schreiben (Jetzt recht sich das!).

Es geht darum über eine VB.NET Applikation gegen die MSSQL Datenbank einen SQL-Befehl zu schießen der mir den Durschnittswert der Dauer eines Monates zurückgibt.

Tabelle:
ID(Auto. INT)|Datum(date)|Uhrzeit(time(7)|Dauer(nvarchar(50))|
--------------------------------
1 |2013-05-26 | 18:50:00 | 00:00:58
2 |2013-05-27 | 16:05:00 | 00:02:04
...

Ich scheitere daran die Dauer so zu konvertieren, damit ich den durschnitt aus dem Monat berechnen kann.

Momentaner code
SELECT cast(month(Datum) AS varchar(50)) + '.' + cast(year(Datum) AS varchar(50)) AS Datum, cast(Dauer AS time) AS Dauer FROM Call WHERE Datum BETWEEN '25.05.2013' AND '01.08.2013' AND (Firmen_ID=4 OR Firmen_ID=5 OR Firmen_ID=6) GROUP BY cast(month(Datum) AS varchar(50)) + '.' + cast(year(Datum) AS varchar(50)), Dauer ORDER BY DATUM


Vielen dank für Eure Hilfe :)

Warum den Monat und das Jahr als varchar(50)? Tut das Not?

In Deiner WHERE-Condition gibst Du das Datum als '25.05.2013' an, bist Du Dir sicher, daß das die DB auch als solches versteht? Zumal in Deiner Tabellenanzeige das Format anders ist.

Deine Aufgabe würde ich in PostgreSQL so lösen, vielleicht hilft es Dir.

Code:
test=*# create table mgross93 (datum date, dauer text);
CREATE TABLE
Time: 9,929 ms
test=*# copy mgross93 from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 2013-05-01   00:00:10
>> 2013-05-10   00:00:20
>> 2013-06-05   01:00:00
>> 2013-06-15   02:00:00
>> \.
Time: 53184,570 ms
test=*# commit;
COMMIT
Time: 0,420 ms
test=# select to_char(datum,'yyyy-mm'), sum(dauer::interval) from mgross93 group by 1;
 to_char |   sum
---------+----------
 2013-05 | 00:00:30
 2013-06 | 03:00:00
(2 rows)

Andreas
 

mgross93

Benutzer
Beiträge
5
Das angeben von Monat und Jahr in varchar(50) dient nur zur Datumsidentifizierung. Da die Werte in ein Diagramm angehengt werden dient es außerdem als Legende.
 

mgross93

Benutzer
Beiträge
5
Habe das Problem gelöst:
Sieht zwar wild aus aber das ist die Lösung um einen Zeitlichen Mittelwert aus nvarchar zu errechnen:

Code:
SELECT cast(month(Datum) AS varchar(50)) + '.' + cast(year(Datum) AS varchar(50)) AS Datum, [U][COLOR=#00ff00]cast(avg(cast(cast(left(dauer,12) as datetime) as Float)) as datetime) AS Dauer[/COLOR][/U]
FROM Call
WHERE Datum BETWEEN '25.05.2013' AND '01.08.2013' AND (Firmen_ID=4 OR Firmen_ID=5 OR Firmen_ID=6)
GROUP BY cast(month(Datum) AS varchar(50)) + '.' + cast(year(Datum) AS varchar(50)), Dauer ORDER BY DATUM
 

mgross93

Benutzer
Beiträge
5
Korrektur:

Code:
SELECT cast(month(Datum) AS varchar(50)) + '.' + cast(year(Datum) AS varchar(50)) AS Datum, cast(avg(cast(cast(left(dauer,12) as datetime) as Float)) as datetime) AS Dauer
FROM Call
WHERE Datum BETWEEN '01.05.2013' AND '31.08.2013' AND (Firmen_ID=4 OR  Firmen_ID=5 OR  Firmen_ID=6)
GROUP BY cast(month(Datum) AS varchar(50)) + '.' + cast(year(Datum) AS varchar(50)) ORDER BY DATUM
 

akretschmer

Datenbank-Guru
Beiträge
9.846
Korrektur:

Code:
SELECT cast(month(Datum) AS varchar(50)) + '.' + cast(year(Datum) AS varchar(50)) AS Datum, cast(avg(cast(cast(left(dauer,12) as datetime) as Float)) as datetime) AS Dauer
FROM Call
WHERE Datum BETWEEN '01.05.2013' AND '31.08.2013' AND (Firmen_ID=4 OR  Firmen_ID=5 OR  Firmen_ID=6)
GROUP BY cast(month(Datum) AS varchar(50)) + '.' + cast(year(Datum) AS varchar(50)) ORDER BY DATUM

Ja, in der ersten Version war Dauer falsch im GROUP BY, stimmts?
 
Werbung:

Benutzer0000

Benutzer
Beiträge
13
Code:
SELECT
    Convert(DateTime, Datum, 104)
   ,Year(Convert(DateTime, Datum)) as Datum
   ,DatePart(Hour, convert(DateTime, Dauer)) AS Dauer
 
-- so könntest du es machen (wie oben zu sehen):
-- convert( <date/datetime>, <spalte>, <typ (z.b. 104 (deutschland))>) -- so hast du schonmal den String als Date
 
-- year/mont/day(<datum>) -- so bekommst du das Jahr, den Monat und den Tag.
-- datepart(<hour, minute, second ...>, <datetime) -- so bekommst du die Zeitwerte
 
[...]
 
WHERE
    Datum Between '25.05.2013' And '01.08.2013'
    And Firmen_ID in (4, 5, 6) -- Hier kannst du dies auch übersichtlicher lösen.

Hoffentlich können dir diese Informationen weiterhelfen ...

Weitere Informationen zu 'Convert'
Weitere Informationen zu 'Datepart'
Weitere Informationen zu 'in'

MFG
 
Oben