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

Datenbankabfrage 2 Datumsspalten

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von flamx, 14 Juni 2014.

  1. flamx

    flamx Neuer Benutzer

    Hallo,

    ich bin etwas am verzweifeln. Ich habe ein Tabelle, die in etwa so aussieht:

    ID | TicketID | Summary | Created | Updated | Resolution | Resolutiondate |

    Die Spalten Created und Resolutiondate sind datetime-Spalten. Ich brauche eine Abfrage, die mir ein Ergebnis in dieser Form liefert:

    | Datum | Anzahl-Created | Anzahl-Resolved |

    Sprich eine Tabelle die mir pro Tag, die Anzahl der created Tickets und die Anzahl der resolved Tickets aufweist. Resolved ist abhängig von Resolutiondate und der Resolution. Ist die Resolution 5, dann ist das Ticket resolved. Betrachte ich beides alleine, habe ich das hinbekommen. Aber das Problem ist, dass es Tage gibt, an denen zum Beispiel gar kein Ticket erstellt wurde, dafür aber resolved und umgekehrt. Ich brauche aber in der Spalte links, möglichst ein Datum, das mir alle Tage in einen bestimmen Zeitraum auflistet, unabhängig davon, ob an diesem Tag etwas erstellt oder resolved wurde. Ich hab schon versucht mit union, joins, alles mögliche, ich benutze und brauche mysql aber kaum und daher wäre ich für tipps und hinweise von euch dankbar!

    Vielen Dank im Voraus!

    Gruß flamx
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ich nutze PostgreSQL und würde es z.B. so lösen:

    Code:
    test=*# select * from flamx ;
      created  | resolution | resolutiondate
    ------------+------------+----------------
     2014-06-01 |  5 | 2014-06-02
     2014-06-01 |  4 | 2014-06-03
     2014-06-01 |  |
      |  5 | 2014-06-04
    (4 rows)
    
    Das hast Du. Nun baue ich mir eine VIEW:

    Code:
    test=*# create view alle_tage as select ('2014-06-01'::date + s * '1day'::interval)::date from generate_series(0,9)s;
    CREATE VIEW   
    
    Nicht zwingend nötig, vereinfach aber später das alles.

    So, nun ohne beachtung der Resolution:

    Code:
    test=*# select t.date, count(f1.*), count(f2.*) from alle_tage t left join flamx f1 on t.date=f1.created left join flamx f2 on t.date=f2.resolutiondate group by t.date order by t.date;
      date  | count | count   
    ------------+-------+-------   
     2014-06-01 |  3 |  0   
     2014-06-02 |  0 |  1   
     2014-06-03 |  0 |  1   
     2014-06-04 |  0 |  1   
     2014-06-05 |  0 |  0   
     2014-06-06 |  0 |  0   
     2014-06-07 |  0 |  0   
     2014-06-08 |  0 |  0   
     2014-06-09 |  0 |  0   
     2014-06-10 |  0 |  0   
    (10 rows)   
    
    Und mit Resolution=5:

    Code:
    test=*# select t.date, count(f1.*), count(f2.*) from alle_tage t left join flamx f1 on t.date=f1.created left join flamx f2 on t.date=f2.resolutiondate and f2.resolution=5 group by t.date order by t.date;   
      date  | count | count   
    ------------+-------+-------
     2014-06-01 |  3 |  0
     2014-06-02 |  0 |  1
     2014-06-03 |  0 |  0
     2014-06-04 |  0 |  1
     2014-06-05 |  0 |  0
     2014-06-06 |  0 |  0
     2014-06-07 |  0 |  0
     2014-06-08 |  0 |  0
     2014-06-09 |  0 |  0
     2014-06-10 |  0 |  0
    (10 rows)
    

    MySQL kennt kein generate_series(), Pech für Dich. Wirst Dir also irgend wie anders diese 'Hilfstabelle' bauen müssen, es gibt krude Workarounds dafür. Die 2 count - Spalten könnte man natürlich noch besser benennen.
     
  3. BerndB

    BerndB Datenbank-Guru

    In MySQL / MariaDB gibt es schon eine Möglichkeit Sequenzen zu erzeugen.

    z.B.

    SELECT date_add(now(), INTERVAL seq DAY) FROM seq_1_to_100_step_5;

    2014-06-10 21:33:09
    2014-06-15 21:33:09
    2014-06-20 21:33:09
    2014-06-25 21:33:09
    2014-06-30 21:33:09
    2014-07-05 21:33:09
    2014-07-10 21:33:09
    2014-07-15 21:33:09
    2014-07-20 21:33:09
    2014-07-25 21:33:09
    2014-07-30 21:33:09

    Falls das Plugin nich installiert ist kann man dies so einrichten:

    INSTALL PLUGIN sequence SONAME 'ha_sequence';

    Noch ein paar Infos dazu: https://mariadb.com/kb/en/sequence/

    Gruss

    Bernd
     
    akretschmer gefällt das.
  4. akretschmer

    akretschmer Datenbank-Guru

  5. akretschmer

    akretschmer Datenbank-Guru

    Abgesehen davon ist das IMHO auch wieder a bissl mistig realisiert:

    MariaDB [test]> ALTER TABLE seq_1_to_100 ENGINE = BLACKHOLE;
    Query OK, 0 rows affected (0.07 sec)

    MariaDB [test]> SELECT * FROM seq_1_to_100;
    Empty set (0.00 sec)

    Wer nicht weiß, daß DIESE Tabelle nun SO behandelt wurde, fällt auf die Fresse.
     
  6. BerndB

    BerndB Datenbank-Guru

    Schön, stimmt,

    das geht auch nicht wenn du im information_schema bist. Also USE information_schema. Dann musst du
    einen DB Namen vor die Tabelle setzen .

    Code:
    SELECT * FROM mysql.seq_1_to_100;
    Aber das alles steht ja schon auf der 1.en Seite der Doku. Und lesen musste schon ab un an.


    PG wird schon seine Darseinsberechtigung haben. MySQL/MariaDB ist sehr weit verbreitet und
    funktioniert einwandfrei auch in grossen Systemem problemlos.

    Gruss

    Bernd
     
Die Seite wird geladen...

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