Announcement

Collapse
No announcement yet.

Zeitvergleich über Parameter

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

  • Zeitvergleich über Parameter

    Ich habe folgendes Problem:

    Ich habe eine ADOQuery, die mehrere Einträge enthält, darunter eine Zeit und gehe diese dann einzeln durch. Für jede Zeile muss ich weitere Daten ermitteln, was ich über eine zwei ADOQuery löse. Der Schlüssel hierbei ist die Zeit, der die beiden Queries 1:1 miteinander verbindet.

    Da das Programm auf verschiedenen Regionaleinstellungen und Betriebsystemen laufen soll, mache ich diesen Zeitvergleich über einen Parameter.

    Vereinfacht also so:

    Code:
    SELECT * FROM Tabelle
    WHERE Zeit = :Zeit
    Den Parameter "Zeit" setze ich dann auf die Zeit der anderen ADOQuery:

    Code:
    ADOQuery2->Parameters->ParamByName("Zeit")->Value = ADOQuery1->FieldByName("Zeit")->AsDateTime;
    Ich öffne daraufhin die Zweite Query, was auch erstmal funktioniert (ADOQuery2->Active ist true), allerdings gibt es kein Ergebnis zurück (ADOQuery2->RecordCount ist 0). Das heißt der Zeitvergleich hat kein Ergebnis zurückgeliefert, obwohl in der Datenbank jeweils die gleiche Zeit steht.

    Nach etwas debuggen habe ich gemerkt, dass die Zeit, die mir in der Datenbank angezeigt wird "13:00:15" ist während die Zeit, die mir der Parameter zurückgibt, "13:00:16" ist. Also eine Sekunde Unterschied! Der SQL Server sagt daraufhin "Nein die sind nicht gleich".

    Ich vermute, dass entweder im float oder im varient, die Zeit nicht ganz exakt gespeichert wird und daher eine Ungenauigkeit entsteht.
    Gibt es andere mit dem Problem. Wie würdet ihr es lösen?

    Meine temporäre Lösung ist es den Zeitvergleich 'unscharf' zu machen sprich:

    WHERE Zeit > :Zeit-0.0002
    AND Zeit < :Zeit+0.0002

    Das funktioniert zwar, ist aber problematisch, da dadurch auch mal zwei Zeilen zurückkommen können und ich diese dann nicht eindeutig zuordnen kann.

  • #2
    Habe zwar nicht genau verstanden um was es geht, aber das

    Ich vermute, dass entweder im float oder im varient, die Zeit nicht ganz exakt gespeichert wird und daher eine Ungenauigkeit entsteht.
    dürfte nicht die Ursache sein.
    Christian

    Comment


    • #3
      Eine andere möglichkeit wäre, dass du das ganze schon bei Schreiben in die DB änderst. Der Vorschlag ist sicher nicht so astrein vom Ansatz her, aber müsste funktionieren. Was ich meine ist folgendes:
      Bei Speichern der Zeit, die Zeit als STRING in die DB speichern. Sprich, die columns vom typ varchar wählen und mit
      Code:
      ADOQuery1->FieldByName("Zeit")->AsString = DateToStr(Date)
      reinschreiben. Gleiches bei der anderen Tabelle. Dann kannste nämlich nen Stringvergleich machen.

      Das ist nur ne Variante, die mir einfällt, um das Problem zu umschiffen. Warum der dir da ne Sekunde draufrechnet, obwohl in der Datenbank das richtige steht, ist mir allerdings auch ein Rätsel.

      Comment


      • #4
        @Christian
        Es geht darum, dass ich einen Parameter auf eine Zeit setze und dieser Parameter dann plötzlich eine Sekunde mehr enthält und der Vergleich daher fehlschlägt.

        @mez
        Habe ja bereits oben geschrieben, dass es auf verschiedenen Betriebssystemen laufen muss, die immer wieder wechselnde Regionaleinstellungen haben können. Ich hatte anfangs einen Stringvergleich, aber das ist problematisch, weil es nicht funktioniert, wenn die Regionaleinstellungen nicht mit der Betriebsystemsprache übereinstimmen oder die Regionaleinstellungen geändert werden.

        Comment


        • #5
          hm....stimmt
          und was ist, wenn du das feld einfach als string oder integer ausliest und das dann direkt vergleichst?? ohne das vorher umzurechnen in ein lesbares datumsformat??

          Comment


          • #6
            Ich rechne es nie um in ein lesbares Format. Es wird als datetime ausgelesen und der parameter wird direkt auf den datetime Wert gesetzt.

            Ich bin mir ziemlich sicher, dass es irgendwie mit der Genauigkeit zu tun hat, siehe mein Codezitat oben:
            ADOQuery2->Parameters->ParamByName("Zeit")->Value = ADOQuery1->FieldByName("Zeit")->AsDateTime;

            Comment

            Working...
            X