Dynamische mit dem Datum gehen

Hazel4tw1

Aktiver Benutzer
Beiträge
37
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?
 
Werbung:
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.
 
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.
 
Ergbnisse die da raus kommen, kommen mir nicht richtig vor, irgendwie ziemlich hoch.
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

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.
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)
 
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.
 
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
 
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

  • upload_2014-8-1_16-56-23.png
    upload_2014-8-1_16-56-23.png
    30,4 KB · Aufrufe: 1
  • upload_2014-8-1_17-2-47.png
    upload_2014-8-1_17-2-47.png
    33,9 KB · Aufrufe: 3
Du kannst ja mal auf 2 Tage hoch setzen eventuell rundet er da irgendwo falsch aber hatte ich eigentlich ausprobiert.
 
Werbung:
Zurück
Oben