Ankündigung

Einklappen
Keine Ankündigung bisher.

Div. Datums-Abfragen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Div. Datums-Abfragen

    Hallo

    Ich habe diverse Datensätze in der DB u.a. je mit einem Datum.
    Beispiel:

    userid | aufgabe | datum

    Das Datum ist im Format DATE gespeichert.

    Ich übergebe jetzt ein bestimmtes Datum im Format YYYY-mm-dd.

    Nun möchte ich eine Abfrage generieren, die folgendes prüft und speziell hervorhebt:

    SELECT User bei denen ein User ab (Datum aus GET) 6 Datensätze in der Vergangenheit zeigt.

    Also wenn 2015-01-31 übergeben wird, zeige User die gespeichert sind mit Datum:
    2015-01-30
    2015-01-29
    2015-01-28
    2015-01-27
    2015-01-26
    2015-01-25

    User die ab Datum bereits vorgängig an 6 Tagen durchgehend in Einsatz sind, speziell hervorheben.

    Es darf kein Unterbruch vorkommen. Relevant sind also nur User die an all diesen Tagen besetzt sind.

    Ich versuche mit DATE_SUB zum Ziel zu kommen. Muss ich das Datum zurück rechnen und einzeln abfragen oder gibt es einen eleganteren weg?

    Ich hoffe, es ist verständlich..bin für Hinweise dankbar.

  • #2
    Zitat von Saturnus Beitrag anzeigen
    Ich hoffe, es ist verständlich..bin für Hinweise dankbar.
    Wenn ich Dich richtig verstehe hast Du z.B.:

    Code:
          test=# create table saturnus as select 1:: int as id, ('2015-01-31'::date - s * '1day'::interval)::date from generate_series(0,10) s union all select 2, ('2015-01-28'::date - s * '1day'::interval)::date from generate_series(0,3) s;                                                                                               
    SELECT 15                                                                                                                                                          
    Time: 18,241 ms                                                                                                                                                    
    test=*# select * from saturnus ;                                                                                                                                   
     id |    date                                                                                                                                                      
    ----+------------                                                                                                                                                  
      1 | 2015-01-31                                                                                                                                                   
      1 | 2015-01-30                                                                                                                                                   
      1 | 2015-01-29                                                                                                                                                   
      1 | 2015-01-28                                                                                                                                                   
      1 | 2015-01-27                                                                                                                                                   
      1 | 2015-01-26                                                                                                                                                   
      1 | 2015-01-25                                                                                                                                                   
      1 | 2015-01-24                                                                                                                                                   
      1 | 2015-01-23                                                                                                                                                   
      1 | 2015-01-22                                                                                                                                                   
      1 | 2015-01-21                                                                                                                                                   
      2 | 2015-01-28                                                                                                                                                   
      2 | 2015-01-27                                                                                                                                                   
      2 | 2015-01-26                                                                                                                                                   
      2 | 2015-01-25                                                                                                                                                   
    (15 rows)
    und suchst:

    Code:
    test=*# select id from saturnus s left join (select ('2015-01-31'::date -s * '1day'::interval)::date from generate_series(0,5) s) a on s.date=a.date where a.date is not null group by id having count(1) = 6;
     id
    ----
      1
    (1 row)
    Oder?
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Wieso nicht einfach Order-By und dann ein LIMIT setzen:
      Code:
      SELECT blablub FROM dateTable WHERE date='$filtered' ORDER BY date DESC LIMIT 6

      Kommentar


      • #4
        Zitat von Phpyton Beitrag anzeigen
        Wieso nicht einfach Order-By und dann ein LIMIT setzen:
        Ganz einfach: weil das nicht die Aufgabe löst.

        Hint: nicht irgendwas posten, sondern nur was hilfreiches
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          Tut mir Leid, dann hab ich ihn wohl falsch verstanden.

          Kommentar


          • #6
            @akretschmer
            Ich arbeite mit mysqli.. Dein Code sieht für mich nicht gerade vertraut aus

            Nochmal auf gut Deutsch:
            Wenn jemand vor dem Tag X bereits 6 Tage am Stück im Einsatz war, darf er für einen neuen Einsatz nicht berücksichtigt werden.

            Kommentar


            • #7
              Zitat von Saturnus Beitrag anzeigen
              @akretschmer
              Ich arbeite mit mysqli..
              Das ist heilbar

              Dein Code sieht für mich nicht gerade vertraut aus
              Nun, das ist SQL - PostgreSQL. Ich nutze halt gerne da die Dinge, die es bietet. Um zu prüfen, ob die 6 Tage vorher da Einträge sind ist es praktisch, on-the-fly eine Liste dieser Tage zu generieren und darüber zu joinen, um dann zählen zu können, wie oft der Join gelang.

              Nochmal auf gut Deutsch:
              Wenn jemand vor dem Tag X bereits 6 Tage am Stück im Einsatz war, darf er für einen neuen Einsatz nicht berücksichtigt werden.
              Habs, denke ich, also korrekt verstanden und das Resultat paßt ja auch - id=1.
              PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

              Kommentar


              • #8
                test=*# select id from saturnus s left join (select ('2015-01-31'::date -s * '1day'::interval)::date from generate_series(0,5) s) a on s.date=a.date where a.date is not null group by id having count(1) = 6;
                id
                Danke für die Hilfe.
                Hast du das auch in 'unheilbar' mysql select?

                Kommentar


                • #9
                  Zitat von Saturnus Beitrag anzeigen
                  Danke für die Hilfe.
                  Hast du das auch in 'unheilbar' mysql select?
                  Google mal nach einem MySQL-Ersatz für generate_series(), das ist IMHO alles, was Dir hier in MySQL zum Glück fehlt.
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar

                  Lädt...
                  X