Announcement

Collapse
No announcement yet.

Abfragen ob ein Datum in einem Zeitbereich liegt

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Abfragen ob ein Datum in einem Zeitbereich liegt

    Hallo zusammen,

    ich hab wieder mal ein problem, welches wahrscheinlich recht simpel zu lösen ist wenn man weiß wie ;-)

    in der einen tabelle (tabelle A) habe ich unter anderem eine start- und eine endzeit.
    in der anderen tabelle (tabelle B) irgendwelche daten wobei auch hier eine spalte zeiten enthält.

    jetzt will ich aus tabelle B die daten haben, wo die zeit aus tabelle B zwischen start- und endzeit aus tabelle a liegt.
    gesichert ist auch, dass auf jeden fall aus tabelle b nur eine zeit in einem zeitraum aus tabelle A liegt. wobei es generell natürlich mehrere zeiten in tabelle b und mehrere zeiträume in tabelle a gibt. die "zuordnung" der zeiten zu den zeiträumen aus tabelle a ist halt das problem.

    das geht normalerweise recht einfach mit "BETWEEN ... AND".
    problem ist halt, dass wenn ich schreibe "
    Code:
    ... where time BETWEEN (select starttime from tabelle A) AND (select endtime from tabelle A)
    mehrere werte zurückkommen und mysql das ja nicht annimmt.
    kann ich irgendwie gucken ob die zeit aus tabelle b in einem zeitbereich aus tabelle a liegt?


    auf hilfe hoffend, der ratlose christian.

  • #2
    Es wäre schön, Du würdest ein paar Zeilen aus den Tabellen hier einstellen, dann kann man leichter sehen, worum es geht.

    Comment


    • #3
      hi,

      da ich nicht weiß ob und wie man hier ggf. tabellen darstellen kann nehm ich mal die code-dinger:

      tabelle a:
      Code:
      drivercode	driverno	objectno	start_time		end_time		duration	pausetime
      101		101		012		2010-01-13T06:26:20Z	2010-01-13T08:57:51Z	9060		2
      101		101		008		2010-01-20T08:59:18Z	2010-01-20T15:26:09Z	23160	 
      101		101		008		2010-01-21T13:11:38Z	2010-01-21T13:53:44Z	2520	 
      104		104		013		2010-01-21T13:25:57Z	2010-02-04T17:04:38Z	1222680		1196
      17		17		007		2010-01-20T23:03:11Z	2010-01-20T23:29:05Z	1500		129
      106		107		010		2010-01-08T16:05:24Z	2010-01-10T11:25:21Z	155940		134
      106		107		010		2010-01-10T18:30:05Z	2010-02-02T09:25:29Z	1954500		2
      17		17		007		2010-01-21T20:01:17Z	2010-01-21T20:15:11Z	780
      tabelle b:

      Code:
      msg_time		objectno	driverno	orderno	kostenstelle
      2010-01-20T23:18:24Z	007	 	 			0815
      2010-01-21T20:15:03Z	007	 	 			0816
      2010-02-05T11:35:18Z	007	 	 			0817
      ziel ist nun folgendes: ich will alle felder (außer start_time und end_time) aus tabelle a und das feld "kostenstelle" aus tabelle b haben.
      die zugehörige zeit zu kostenstelle 0815 liegt zwischen der start und endzeit von dem datensatz wo der drivercode hier grade mal 17 ist. also soll im ergebnis die 0815 mit hinter dem datensatz auftauchen.

      die kostenstelle 0816 liegt hier zwischen start- und endzeit aus dem letzten datensatz der tabelle a.

      inzwischen bin ich mir recht sicher, dass das irgendwie mit cursorn machbar sein muss weil ich ja jeweils nur die werte einer zeile vergleichen muss und nicht die gesamte menge. aber mysql kann keine cursor. jedenfalls nicht die 5.0. der hat bei mir nur rumgespukt sobald da was von "declare" stand...

      bye, Christian.

      Comment


      • #4
        2010-01-21T20:01:17Z

        Was ist das für ein Format? Was haben das T und Z dort verloren?

        Comment


        • #5
          das ist der ISO 8601 standard... da ist das so.

          http://de.wikipedia.org/wiki/ISO_8601

          das T und das Z hängen wohl irgendwie mit der UTC zeitzone zusammen. das gibt an, dass die zeit nach einer zeit in dieser zeitzone angegeben ist.

          Zeitzonen [Bearbeiten]
          Laut Empfehlung muss nach einer zusammenhängenden Datums- und Zeitangabe die Differenz zur Koordinierten Weltzeit (UTC) angegeben werden. Das Format ist „±HH:mm“ oder „±HH“ und berücksichtigt damit sowohl die Zeitzone (z.B. Europe/Berlin) als auch die Sommerzeit. Als spezieller Wert kann auch Z für UTC eingetragen werden.
          Beispiele:
          2007-08-31T16:47+00:00 16:47 Uhr am 31. August 2007 in der Zeitzone UTC.
          2007-12-24T18:21Z 18:21 Uhr am 24. Dezember 2007, ebenfalls in der Zeitzone UTC.
          2008-02-01T09:00:22+05:00 9:00:22 Uhr am 1. Februar 2008, in einer Zeitzone, die UTC fünf Stunden voraus ist, beispielsweise in der in Pakistan festgelegten Zonenzeit.
          2009-01-01T12:00:00+01:00 12:00:00 Uhr am 1. Januar 2009 in Wien (MEZ)
          2009-06-30T18:30:00+02:00 18:30:00 Uhr am 30. Juni 2009 in Wien (MESZ - Sommerzeit)

          Comment


          • #6
            Warum nicht einfach mittels LEFT JOIN?

            Code:
            SELECT a.drivercode, a.driverno, a.objectno, a.duration, b.kostenstelle 
            FROM tabelle_a a
            LEFT JOIN tabelle_b b
                USING (objectno)
            WHERE b.msgtime BETWEEN a.starttime AND a.endtime
                OR b.msgtime IS NULL
            Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

            Comment


            • #7
              das is ja geil, das funktioniert :-)
              USING klausel war mir bisher auch völlig unbekannt. aber klappt. danke :-)

              Comment

              Working...
              X