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

Dynamische mit dem Datum gehen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Hazel4tw1, 31 Juli 2014.

  1. Hazel4tw1

    Hazel4tw1 Aktiver Benutzer

    Hallo zusammen,

    und zwar habe ich folgende Abfrage:

    Select DAY(Solved_Date_Time),
    SUM( case
    when Creation_Date <= '2014-07-01 20:00:00' and Solved_Date_Time >= '2014-07-02 08:00:00'
    then 1
    else 0
    end) as Ticket

    from ServiceTickets
    --WHERE month(Solved_Date_Time) = 7
    --AND year(Solved_Date_Time) = 2014
    group by DAY(Solved_Date_Time)

    sowas kommt raus:
    upload_2014-7-31_15-58-50.png

    Jetzt soll es aber so sein, das ich für den

    1. im Monat Creation_Date <= '2014-07-01 20:00:00' and Solved_Date_Time >= '2014-07-02 08:00:00'
    2. im Monat Creation_Date <= '2014-07-02 20:00:00' and Solved_Date_Time >= '2014-07-03 08:00:00'
    3. im Monat Creation_Date <= '2014-07-03 20:00:00' and Solved_Date_Time >= '2014-07-04 08:00:00'
    usw.


    weil im Moment gilt ja für jeden Tag nur '2014-07-01 20:00:00' and Solved_Date_Time >= '2014-07-02 08:00:00'


    gibt es dort eine Möglichkeit? das hoch zählen zu lassen oder ähnliches?
     
  2. ukulele

    ukulele Datenbank-Guru

    Also erstmal der Hinweis wenn du year() auskommentierst vermischt du natürlich verschiedene Jahre.

    Dann kann noch das Problem entstehen das wenn du nach Solved_Date_Time gruppierst (insbesondere nur dem Tag) und an einem Tag wurden keine Tickets solved aber created, dann werden diese eventuell nicht oder nicht am passenden Tag gezählt.

    Wie wärs hiermit:
    Code:
    SELECT    t.jahr,
            t.monat,
            t.tag,
            sum(t.solved) AS solved,
            sum(t.created) AS created
    FROM    (
    SELECT    year(dateadd(hour,8,Solved_Date_Time)) AS jahr,
            month(dateadd(hour,8,Solved_Date_Time)) AS monat,
            day(dateadd(hour,8,Solved_Date_Time)) AS tag,
            1 AS solved,
            0 AS created
    FROM    ServiceTickets
    UNION ALL
    SELECT    year(dateadd(hour,-4,Creation_Date)) AS jahr,
            month(dateadd(hour,-4,Creation_Date)) AS monat,
            day(dateadd(hour,-4,Creation_Date)) AS tag,
            0 AS solved,
            1 AS created
    FROM    ServiceTickets
    ) t
    GROUP BY t.jahr,t.monat,t.tag
    Über dateadd() verschiebe ich das Ticket etwas, so das der Wert aus day() immer jeweils dem Tag entsprechen sollte dem das Ticket zugeordnet wird.
     
  3. Hazel4tw1

    Hazel4tw1 Aktiver Benutzer

    Ergbnisse die da raus kommen, kommen mir nicht richtig vor, irgendwie ziemlich hoch.


    Ich will mit der Abfrage bewirken das ich alle Tickets kriege die an dem Tag kreiert wurden, aber nicht am gleichen Tag auch gelößt wurden. Deswegen habe ich das Datum weggenommen, da es ja sein könnte das vor 3 Jahren ein Ticket erstellt wurde, welches heute erst gelößt ist.
     
  4. ukulele

    ukulele Datenbank-Guru

    Eventuell meinst du die NULL Werte? Die Anzahl der Solved Einträge zu prüfen sollte ja nicht schwer sein, die Summe muss ja immer mit der der gesamten Tabelle passen. (Ich hab schließlich alle Jahre Monate und Tage berücksichtigt.
    Code:
    SELECT    t.jahr,
            t.monat,
            t.tag,
            sum(t.solved) AS solved,
            sum(t.created) AS created
    FROM    (
    SELECT    year(dateadd(hour,8,Solved_Date_Time)) AS jahr,
            month(dateadd(hour,8,Solved_Date_Time)) AS monat,
            day(dateadd(hour,8,Solved_Date_Time)) AS tag,
            1 AS solved,
            0 AS created
    FROM    ServiceTickets
    WHERE    Solved_Date_Time IS NOT NULL
    UNION ALL
    SELECT    year(dateadd(hour,-4,Creation_Date)) AS jahr,
            month(dateadd(hour,-4,Creation_Date)) AS monat,
            day(dateadd(hour,-4,Creation_Date)) AS tag,
            0 AS solved,
            1 AS created
    FROM    ServiceTickets
    WHERE    Creation_Date IS NOT NULL
    ) t
    GROUP BY t.jahr,t.monat,t.tag
    Summe:
    Code:
    SELECT    count(*) AS solved
    FROM    ServiceTickets
    WHERE    Solved_Date_Time IS NOT NULL
    
    SELECT    count(*) AS created
    FROM    ServiceTickets
    WHERE    Creation_Date IS NOT NULL
    Code:
    SELECT    *
    FROM    ServiceTickets
    WHERE    Creation_Date IS NOT NULL
    AND        Solved_Date_Time IS NOT NULL
    AND        cast(cast(dateadd(hour,-4,Creation_Date) AS INT) AS DATETIME) !=
            cast(cast(dateadd(hour,8,Solved_Date_Time) AS INT) AS DATETIME)
     
  5. Hazel4tw1

    Hazel4tw1 Aktiver Benutzer

    Also

    Code:
    SELECT    t.jahr,
            t.monat,
            t.tag,
            sum(t.solved) AS solved,
            sum(t.created) AS created
    FROM    (
    SELECT    year(dateadd(hour,8,Solved_Date_Time)) AS jahr,
            month(dateadd(hour,8,Solved_Date_Time)) AS monat,
            day(dateadd(hour,8,Solved_Date_Time)) AS tag,
            1 AS solved,
            0 AS created
    FROM    ServiceTickets
    WHERE    Solved_Date_Time IS NOT NULL
    UNION ALL
    SELECT    year(dateadd(hour,-4,Creation_Date)) AS jahr,
            month(dateadd(hour,-4,Creation_Date)) AS monat,
            day(dateadd(hour,-4,Creation_Date)) AS tag,
            0 AS solved,
            1 AS created
    FROM    ServiceTickets
    WHERE    Creation_Date IS NOT NULL
    ) t
    GROUP BY t.jahr,t.monat,t.tag

    gibt mir sowas aus:

    upload_2014-8-1_11-29-5.png


    aber halt nicht welche Tickets an diesem tag geöffnet wurden aber nicht geschlossen wurden.
    Und die beiden von einander abzu ziehen macht ja auch kein sinn.

    Ich ich hoffe das macht meine Abfrage im ersten Post für den einen Tag, und dann zieht er das halt weiter, also das am 11.07 insgesamt 11 Tickets geschlossen wurden die vor dem 01.07 erstellt wurden.
     
  6. ukulele

    ukulele Datenbank-Guru

    Ich verstehe deinen Plan und hab die Abfrage mal etwas umgebaut. Erstmal berücksichtige ich deine Zeitkorrektur in einer eigenen Abfrage in dem ich Quasi eine Sicht mit einem angepassten Creation_Date und Solved_Date erzeuge auf die ich mich dann in der Folge beziehen kann. Tickets die nach 20 Uhr erzeugt wurden werden dem Folgetag zugeordnet, Tickets die vor 8 Uhr erledigt wurden werden dem Vortag als erledigt zugeschlagen. Außerdem ermittel ich die Zeit zwischen den beiden Tickettagen als Tageswert, liegt er über 1 ist das Ticket nicht am zeitnah erledigt worden.
    Erst im zweiten Schritt führe ich die Werte von erstellten und erledigten Werten zusammen gruppiert und sortiert.
    Code:
    WITH t1 AS (
    SELECT    datediff(hh,dateadd(hour,-4,Creation_Date),dateadd(hour,8,Solved_Date_Time)) AS zeit,
            dateadd(hour,-4,Creation_Date) AS Creation_Date,
            dateadd(hour,8,Solved_Date_Time) AS Solved_Date_Time
    FROM    ServiceTickets
    )
    SELECT    t2.jahr,
            t2.monat,
            t2.tag,
            sum(t2.solved) AS solved_total,
            sum(t2.solved_in_time) AS solved_in_time,
            sum(t2.created) AS created_total
    FROM    (
    SELECT    year(Solved_Date_Time) AS jahr,
            month(Solved_Date_Time) AS monat,
            day(Solved_Date_Time) AS tag,
            (    CASE
                WHEN    zeit <= 1
                THEN    1
                ELSE    0
                END ) AS solved_in_time,
            1 AS solved,
            0 AS created
    FROM    t1
    WHERE    Solved_Date_Time IS NOT NULL
    UNION ALL
    SELECT    year(Creation_Date) AS jahr,
            month(Creation_Date) AS monat,
            day(Creation_Date) AS tag,
            0 AS solved_in_time,
            0 AS solved,
            1 AS created
    FROM    t1
    WHERE    Creation_Date IS NOT NULL
    ) t2
    GROUP BY t2.jahr,t2.monat,t2.tag
    ORDER BY t2.jahr,t2.monat,t2.tag
     
  7. Hazel4tw1

    Hazel4tw1 Aktiver Benutzer

    Ich glaub die Daten sehen besser aus, muss ich aber nochmal im Detail gucken.

    aber traurig wäre der Report wenn er stimmt was solved in time angeht, die ganze spalte ist 0 :D

    upload_2014-8-1_17-4-42.png
     

    Anhänge:

  8. ukulele

    ukulele Datenbank-Guru

    Du kannst ja mal auf 2 Tage hoch setzen eventuell rundet er da irgendwo falsch aber hatte ich eigentlich ausprobiert.
     
  9. Hazel4tw1

    Hazel4tw1 Aktiver Benutzer

    Danke, habe ich mir gedacht, ich spiel im Moment damit rum um zu gucken ob die Ergebnisse richtig sind, danke.
     
Die Seite wird geladen...
Ähnliche Themen - Dynamische Datum gehen
  1. TurboKanne
    Antworten:
    10
    Aufrufe:
    2.843
  2. Quest
    Antworten:
    8
    Aufrufe:
    707
  3. Foxamon
    Antworten:
    21
    Aufrufe:
    4.632
  4. Monarch
    Antworten:
    14
    Aufrufe:
    2.752
  5. noobie
    Antworten:
    1
    Aufrufe:
    1.018

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