Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Durschnittswert aus nvarchar(50) erstellen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von mgross93, 13 August 2013.

  1. mgross93

    mgross93 Benutzer

    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 :)
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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
     
  3. mgross93

    mgross93 Benutzer

    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.
     
  4. mgross93

    mgross93 Benutzer

    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
     
  5. mgross93

    mgross93 Benutzer

    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
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Ja, in der ersten Version war Dauer falsch im GROUP BY, stimmts?
     
  7. mgross93

    mgross93 Benutzer

    Jup. Stimmt :)
     
  8. Benutzer0000

    Benutzer0000 Benutzer

    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
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden