Andi: Datenfeldüberschneidung

Hallo,

ich habe n Daten in einer DB.
Ich möchte nun, dass sich die Daten nicht überschneiden.

Bsp.:

01/02/2005 - 31/02/2005
01/03/2005 - 31/03/2005

14/02/2005 - 16/02/2005

Hier würden sich 2 Datenfelder miteinander überschneiden. Wie kann ich das abfragen, ob sich die Datenfelder überschneiden.
Wäre für eine Denkanstoß dankbar.

Gruß
Andi

  1. Hi Anidi,

    01/02/2005 - 31/02/2005
    01/03/2005 - 31/03/2005

    14/02/2005 - 16/02/2005

    ich versteh nicht ganz aof was du hinauswillst aber vll könnte dir ORDER BY helfen.

    MfG

    1. Hi Anidi,

      01/02/2005 - 31/02/2005
      01/03/2005 - 31/03/2005

      14/02/2005 - 16/02/2005

      ich versteh nicht ganz aof was du hinauswillst aber vll könnte dir ORDER BY helfen.

      Nein leider nicht. Es darf sich nichts überschneiden.
      Machen wir ein Zahlenbeispiel:

      1-5
      6-10
      Überschneidet sich nicht

      1-5
      2-3
      Überschneidet sich

      Gruß
      Andi

      1. Hi,

        was ist denn das für ein Datentyp mit dem du diese Felder speicherst? Sind das zwei Datumsfelder oder einfacher Text?

        MfG
        Rouven

        --
        -------------------
        ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
        1. was ist denn das für ein Datentyp mit dem du diese Felder speicherst? Sind das zwei Datumsfelder oder einfacher Text?

          Das sind Datumsfelder.

          Gruß
          Andi

          1. Hallo,

            suchst Du so etwas:

            DB:
            TABELLE TEST:
            VON_WERT    BIS_WERT
            01.01.2004  31.01.2004
            01.02.2004  29.02.2004

            Dann bekommst Du die Zwischenprüfung über:

            SELECT count (*)
            FROM test
            WHERE
            -- Vergleichswert von liegt in den Datumswerten
            (von_wert < TO_DATE(von_vrgl,'DD.MM.YYYY') AND
            bis_wert > TO_DATE(von_vrgl,'DD.MM.YYYY')) OR
            -- Vergleichswert bis liegt in den Datumswerten
            (von_wert < TO_DATE(bis_vrgl,'DD.MM.YYYY') AND
            bis_wert > TO_DATE(bis_vrgl,'DD.MM.YYYY')) OR
            -- Vergleichswerte "umaren" DB-Werte
            (von_wert > TO_DATE(von_vrgl,'DD.MM.YYYY') AND
            bis_wert < TO_DATE(bis_vrgl,'DD.MM.YYYY'))

            Habe ich jetzt so nicht getestet, sollte aber funktionieren.

            Grüsse aus Aachen
            Marko

            1. Hallo,

              suchst Du so etwas:

              DB:
              TABELLE TEST:
              VON_WERT    BIS_WERT
              01.01.2004  31.01.2004
              01.02.2004  29.02.2004

              Dann bekommst Du die Zwischenprüfung über:

              SELECT count (*)
              FROM test
              WHERE
              -- Vergleichswert von liegt in den Datumswerten
              (von_wert < TO_DATE(von_vrgl,'DD.MM.YYYY') AND
              bis_wert > TO_DATE(von_vrgl,'DD.MM.YYYY')) OR
              -- Vergleichswert bis liegt in den Datumswerten
              (von_wert < TO_DATE(bis_vrgl,'DD.MM.YYYY') AND
              bis_wert > TO_DATE(bis_vrgl,'DD.MM.YYYY')) OR
              -- Vergleichswerte "umaren" DB-Werte
              (von_wert > TO_DATE(von_vrgl,'DD.MM.YYYY') AND
              bis_wert < TO_DATE(bis_vrgl,'DD.MM.YYYY'))

              Habe ich jetzt so nicht getestet, sollte aber funktionieren.

              Hi,

              also ich habe jetzt selbst ein bischen gebastelt:

              SELECT count(*)
              FROM test
              WHERE 'wertZuTesten' BETWEEN DATUM1 AND DATUM2

              Wenn ich jedes neue Datum mit dieser Abfrage teste dann wird immer ein richtiges Datum enthalten sein.

              Manchmal sieht man den Wald vor lauter ...

              Gruß
              Andi

              1. Hi,

                wow... wenn, du das für jeden möglichen Wert (Datensatz) in deiner Tabelle machst, nachdem er drin steht, erzeugst du aber massig Verkehr.

                Du solltest den einzutragenden Wert überprüfen, bevor du ihn einträgst.

                Ciao, Frank

  2. Hello,

    01/02/2005 - 31/02/2005
    01/03/2005 - 31/03/2005

    Wo überschneiden die sich denn?
    Da es den 31.03.2005 nicht gibt, sehe ich da kein Problem ;-))

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Hello,

      01/02/2005 - 31/02/2005
      01/03/2005 - 31/03/2005

      Wo überschneiden die sich denn?

      Da es den 31.02.2005 nicht gibt, sehe ich da kein Problem ;-))

      Mein Arbeitsplatrechner hat da allerdings schon Probleme gesehen *gg*

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
  3. Hello,

    wie fein muss denn die Auflösung sein? Immer eine Tag?

    Einen Binaray Index gibt es bei MySQL meines Wissens nicht. Aber durch ein spezielles Statement beim Einfügen könntest Du das bestimmt regeln.

    Du benötigst ein 46 Byte langes Feld, in dem für jeden benutzten Tag ein Bit gespeichert wird. Das kannst Du dann beim Einfügen mit dem neuen Wert ver-unden und es darf kein True dabei herauskommen.

    Oder aber, du führst eine vernünftige Normalisierung durch.

    In einer zweiten Tabelle speicherst Du für jeden Tag einen related record. Wenn Du nun abfragst, darf es eben keine Überschneidungen geben.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau