[MySQL 4.1] Alle Daten im Intervall zurückgeben

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

  • [MySQL 4.1] Alle Daten im Intervall zurückgeben

    Hallo Leute,

    wie kann ich mir alle daten in einem intervall zurückgeben lassen:
    z.B. zwischen dem 2004-01-02 und heute ?


    Vielen Dank

  • #2
    WHERE datum BETWEEN '2004-01-12' AND NOW()
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      ja schon nur der anfang fehlt mir...
      der wichtige part..

      also ohne verknüpfung auf eine tabelle..

      Kommentar


      • #4
        SELECT * ?

        entweder versteh ich nicht was du willst oder du weißt dich nicht auszudrücken oder du weißt selbstnicht was du willst

        erklär's mir doch bitte so als wäre ich 3 jahre alt
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          Ja, also ich will mich nicht auf eine datenbank beziehen....
          ich will einfach direkt in die mysql datenbank machen.
          Das er mir alle Daten zutückgibt... und nicht alle Daten in meiner Datenbank


          Danke

          Kommentar


          • #6
            Original geschrieben von Marauder
            Ja, also ich will mich nicht auf eine datenbank beziehen....
            was du willst und was du kannst...
            ich will einfach direkt in die mysql datenbank machen.
            und wer soll die sauerei wieder wegmachen?
            und nicht alle Daten in meiner Datenbank
            welche dann?
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              erstmal LOL

              hm, drück ich mich so schlecht aus

              also ich kann ja auch z.B. select 2 between 1and 3 machen. so kann ich auch ohne mich auf eine datenbank zu beziehen eine abfrage machen.


              So will alle daten im Format (YYYY-mm-dd) zwischen 2004-01-01 und 2004-05-01 haben...

              Hoffe mir kann jemand helfen..=?

              Danke

              Kommentar


              • #8
                nein
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  Original geschrieben von mrhappiness
                  nein
                  Sorry ich hab gerade versucht zu verstehen was der Herr hier haben möchte....

                  Ich habs jetzt 3mal gelesen und weiss soviel wie vorher
                  [color=blue]MfG Payne_of_Death[/color]

                  [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
                  [color=red]Merke:[/color]
                  [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

                  Murphy`s Importanst LAWS
                  Jede Lösung bringt nur neue Probleme
                  Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
                  In jedem kleinen Problem steckt ein großes, das gern raus moechte.

                  Kommentar


                  • #10
                    OK , anders:

                    also habe folgendes Problem in MySQL:

                    Ich habe eine Tabelle mit folgenden Feldern:

                    Artikelnummer --> int
                    AngebotStart --> Date
                    AngebotEnde --> Date

                    So jetzt das Problem:

                    Ich habe ein Zeitintervall z.B. 2004-01-01 bis 2004-09-05.
                    Jetzt möchte ich wissen wieviele artikel an jedem tag zwischen diesem Zeitraum aktiv war. Also ein COUNT bilden.
                    Das Problem ist, ich kann es zwar mit Count bilden und gruppieren, jedoch bekomm ich dann nicht für jeden tag das Datum und die Anzahl von aktiven Angeboten raus.

                    Also z.B. AngebotStart=2004-01-02, AngebotEnde= 2004-01-05.
                    Jetzt weiss ich zwar am 2004-01-02 hat ein Angebot gestartet, aber ich weiss nicht wieviele Angebote am 01.03.04 aktiv waren.
                    Also wenn an einem datum keins Angebot aktiv war soll er durch den COUNT, 0 zurückgeben.

                    Entweder man müsste das mit einer Subquery lösen oder Funktion nur wie?????


                    Hoffe ich habe mich einigermaßen verstädlich ausgedrückt :-)

                    Vielen dank schonmal,

                    Kommentar


                    • #11
                      Hallo!
                      Der Knackpunkt: Es sollen Zeilen erzeugt werden, die es in der DB gar nicht gibt. Wenn ich das recht sehe, brauchst Du hier wohl noch 'ne Kalenderfunktion (Schaltjahr, Anzahl der Tage pro Monat...).

                      Neue Tabelle: create table ZAHL (Z integer not null default 0)
                      Zahlen von 0 bis max. wählbarer Zeitraum in Tagen eifügen (lassen)
                      Die Abfrage:
                      SELECT "2004-01-01" + INTERVAL Z DAY from ZAHL
                      gibt dann eine Liste mit gültigen Datumswerten ab 2004
                      (inc. Schaltjahr... halt wie ein Kalender)
                      Zuletzt geändert von fuser; 03.05.2004, 16:33.

                      Kommentar


                      • #12
                        Nein Leute,

                        wenn ich das richtig verstanden habe ist das Problem weit aus
                        komplexer als bisher verstanden wurde und stellt meines wissens
                        eines der schwersten Probleme für SQL dar die ich mir vorstellen
                        kann

                        nicht nur, wie fuser schon sagte, sollen hier Daten selektiert werden
                        die gar nicht in der Tabelle vorhanden sind, sondern es soll obedrein
                        noch darüber gruppiert werden.


                        Ich denke nicht das dieses Problem elegant in mySQL zu lösen ist, da SubSElects noch nicht unterstützt werden.

                        Das heist MARAUDER wird nicht um ein skript drum rumkommen

                        Habe gerade mal folgendes Gestestet

                        PHP-Code:
                        // Code zum Erstellen und füllen

                        /* Über der Tabelle
                        CREATE TABLE `test` (
                          `artikel` int(11) NOT NULL default '0',
                          `start` date NOT NULL default '0000-00-00',
                          `end` date NOT NULL default '0000-00-00',
                          PRIMARY KEY  (`artikel`)
                        ) TYPE=MyISAM;
                          

                        */

                        $db = new db();
                        $db->select_db("test");

                                
                         for (
                        $j 1$j<12$j++) {
                            for (
                        $i 1$i<29$i++) {
                                
                        $art++;
                                
                        $m=$j+1;
                                
                        $endbcdiv($i,2)+1;
                                
                        $dat1 "2004-".$j."-".$i;
                                
                        $dat2 "2004-".$m."-".$end;
                                
                                echo 
                        $dat1."  ".$dat2."<br>";
                                
                        $sql "INSERT INTO test
                                (artikel, start, end)
                               VALUES         ( 
                        $art, '$dat1', '$dat2')";

                                if (! 
                        $db->sql($sql)) { echo mysql_error()."<br>";}

                            }


                        und denke das sollte in etwa der Ausgangstablle entsprechen

                        dies wäre nun einkleiner Workaround um das Problem fehlender SUB SELECTS

                        PHP-Code:
                         $db = new db();
                        $db->select_db("test");

                        for (
                        $tage 0$tage <150$tage++) {
                            
                        $sql "SELECT '2004-01-01' + INTERVAL $tage DAY AS datum,
                                        count(artikel) AS anzahl 
                                        FROM test 
                                        WHERE ('2004-01-01' + INTERVAL 
                        $tage DAY) 
                                        BETWEEN start AND end"
                        ;

                            
                        $db_res =  $db->sql($sql);
                            while (
                        $db_row mysql_fetch_assoc($db_res)) {
                                echo 
                        $db_row['datum']." - ".$db_row['anzahl']."<br>";
                            }

                        Und dabei ist das raus gekommen :
                        2004-01-01 - 1
                        2004-01-02 - 2
                        2004-01-03 - 3
                        2004-01-04 - 4
                        2004-01-05 - 5
                        2004-01-06 - 6
                        2004-01-07 - 7
                        2004-01-08 - 8
                        2004-01-09 - 9
                        2004-01-10 - 10
                        2004-01-11 - 11
                        2004-01-12 - 12
                        2004-01-13 - 13
                        2004-01-14 - 14
                        2004-01-15 - 15
                        2004-01-16 - 16
                        2004-01-17 - 17
                        2004-01-18 - 18
                        2004-01-19 - 19
                        2004-01-20 - 20
                        2004-01-21 - 21
                        2004-01-22 - 22
                        2004-01-23 - 23
                        2004-01-24 - 24
                        2004-01-25 - 25
                        2004-01-26 - 26
                        2004-01-27 - 27
                        2004-01-28 - 28
                        ...
                        Denke das hilft!

                        Jemand bessere Lösungen? Wäre mal interessant!

                        Zuletzt geändert von chansel0049; 03.05.2004, 17:17.
                        chansel0049
                        ----------------------------------------------------
                        if you've reached the bottomline - dig further!
                        Übersetzer gesucht? http://www.babelport.com

                        Kommentar


                        • #13
                          Hallo!
                          War das zu Komplex? Es fängt doch erst an.
                          Hier die (ausführliche) SQL-Variante:

                          CREATE TABLE ZAHL ( Z int(11) NOT NULL default 0, KEY Z(Z))
                          TYPE=MyISAM
                          (Zahlen einfügen)

                          CREATE TABLE ARTIKEL (
                          VON date default NULL,
                          BIS date default NULL,
                          ANR int(11) default NULL
                          ) TYPE=MyISAM

                          Artikel:
                          VON/BIS/ANR
                          04.04.2004 05.04.2004 12
                          01.01.2004 20.01.2004 2
                          03.01.2004 04.01.2004 5



                          SELECT "2004-01-01" + INTERVAL Z DAY as TAG,
                          VON,
                          BIS,
                          sum(
                          if (
                          TO_DAYS(VON)<=TO_DAYS("2004-01-01" + INTERVAL Z DAY) and
                          TO_DAYS(BIS)>=TO_DAYS("2004-01-01" + INTERVAL Z DAY),1,0)) as ANZAHL
                          from ZAHL A left join ARTIKEL B on 1=1 group by 1



                          kommt raus:
                          TAG ANZAHL
                          2004-01-01 1
                          2004-01-02 1
                          2004-01-03 2
                          2004-01-04 2
                          2004-01-05 1
                          2004-01-06 1
                          2004-01-07 1
                          2004-01-08 1
                          2004-01-09 1
                          2004-01-10 1
                          2004-01-11 1
                          2004-01-12 1
                          2004-01-13 1
                          2004-01-14 1
                          2004-01-15 1
                          2004-01-16 1
                          2004-01-17 1
                          2004-01-18 1
                          2004-01-19 1
                          2004-01-20 1
                          2004-01-21 0
                          2004-01-22 0
                          2004-01-23 0
                          2004-01-24 0
                          2004-01-25 0
                          2004-01-26 0
                          2004-01-27 0
                          2004-01-28 0
                          2004-01-29 0
                          2004-01-30 0
                          2004-01-31 0


                          Soweit ich das verstanden habe, war's das.

                          Kommentar


                          • #14
                            Hut ab

                            Hi Fuser,

                            Jetzt hast Du nen bewunderer! Mich! Nein im Ernst, nicht schlecht bin beeindruckt,
                            nur hast du hier das problem, das die zweite Tabelle mit einer vorn vornherein unbekannten Anzahl Zahlen gefüllt werden muss (Also nicht wirklich elegant oder?) Nichtsdestotrotz (ein schönes Wort) Hut ab! Interessanter Ansatz!
                            chansel0049
                            ----------------------------------------------------
                            if you've reached the bottomline - dig further!
                            Übersetzer gesucht? http://www.babelport.com

                            Kommentar


                            • #15
                              Hi Jungs,

                              cool das das Thema doch noch Interessenten findet...
                              Fuser dein Ansatz ist schonmal ziemlich gut. Leider ist das
                              mit einer neuen Tabelle nicht die sauberste Alternative.
                              Aber ich sehe das es nur durch eine Funktion in mysql zu lösen ist. Wobei ich davon keine Ahnung habe. Oder nachträglich bzw. vorher durch ein php script.

                              Ich habe jetzt erstmal folgendes gemacht:
                              $firstDate='2004-01-01';
                              $secondDate='2004-02-01';


                              $firstDate=strtotime($firstDate); // Umwandeln in Unix Timestamp
                              $secondDate=strtotime($secondDate); // Umwandeln in Unix Timestamp
                              $firstDateDay=strftime("%d",$firstDate); // Einzelne Werte ermitteln
                              $firstDateMonth=strftime("%m",$firstDate);/**/
                              $firstDateYear=strftime("%Y",$firstDate);/**/

                              $i=0;
                              do
                              {
                              $firstDate = mktime(0, 0, 0,$firstDateMonth,$firstDateDay+$i,$firstDateYear);
                              $vec[$i]=strftime("%Y-%m-%d",$firstDate);
                              $i++;
                              }
                              while ($firstDate!=$secondDate);


                              jetzt steht in meinem Array, jedes Datum zwischen den 2 angegebenen Daten.

                              Könnte ich nicht jetzt irgendwie meine Abfrage mit meinem Daten verknüpfen?
                              Klar mit jweils einer Abfrage für ein Datum. Aber bei 2 Jahren wären das schon über 700 Abfragen. Ist wohl nicht das wahre..
                              Es muss irgendeine andere Lösung dafür geben.
                              Aber richtig gut Fuser!!! Vielen Dank schonmal!!

                              Hättest du noch eine Idee das ohne eine neue Tabelle anzulegen, zu lösen?

                              Kommentar

                              Lädt...
                              X