Sonic: MS SQL - Abfrage mit Between (Datum)

Hallo,

ich habe Datumsfelder in meiner DB, die ein de-Format haben: tt.mm.jjjj hh:mm:ss

Nun habe ich die Funktion "Between" benutzt und bekomme falsche Datensätze geliefert. Liegt das am deutschen Format? Wenn ja, wie kann ich die Daten in der Abfrage ins eng?? ..konvertieren?
Die Daten in der DB sollen unberührt bleiben.

Danke.

  1. Hallo Sonic,

    ich habe Datumsfelder in meiner DB, die ein de-Format haben: tt.mm.jjjj hh:mm:ss

    also keine Felder vom Datentyp DATETIME oder SMALLDATETIME, sondern von einem Zeichenkettentyp, z.B. CHAR oder VARCHAR?

    Nun habe ich die Funktion "Between" benutzt und bekomme falsche Datensätze geliefert. Liegt das am deutschen Format? Wenn ja, wie kann ich die Daten in der Abfrage ins eng?? ..konvertieren?

    Du hast neulich die Funktion CONVERT kennengelernt. CONVERT() oder auch CAST() könntest Du verwenden, um in einer Abfrage die vorhandenen Daten in den Datentyp DATETIME umzuwandeln. Mit dem Operator BETWEEN kannst Du nun die berechneten Daten in der Abfrage eingrenzen.

    Die Daten in der DB sollen unberührt bleiben.

    Das typische Problem: Obwohl die Daten in einem ungeeigneten Format vorliegen, mit dem sich datenbanktechnisch nicht gut arbeiten lässt, müssen sie unberührt bleiben. Du könntest in einer neuen Tabelle mit DATETIME arbeiten und Dir einen View erstellen, der den Namen der bisherigen Tabelle trägt und in dem die Daten (über CONVERT) im alten Format "vorliegen".

    Freundliche Grüße

    Vinzenz

    1. also keine Felder vom Datentyp DATETIME oder SMALLDATETIME, sondern von einem Zeichenkettentyp, z.B. CHAR oder VARCHAR?

      die Datenfelder sind vom Datentyp DATETIME

      Du hast neulich die Funktion CONVERT kennengelernt. »»

      Ja, genau. Ich habe das Zeitteil extrahiert und es hat auch geklappt. Mit dem Datumteil geht es nicht. Wenn ich sage, gib mir alles zwischen 11.11.2005-12.11.2005, er liefert mir 13.11.2005 auch.

      Grüße

      Sonic

      1. Hallo,

        ich habe hier auch eine DB mit dem Feld Datum in der es im deutschen
        Format angezeigt wir und bei mir funktioniert es ohne Probleme ich denke das du vielleicht in der Abfrage einen Fehler hast.

        Probier mal das:

        SELECT * FROM TABELLE where Datum between '01.12.2005' and '14.12.2005'

        Gruß

        Schotti

    2. Kannst du mal gucken, ob es so richtig ist?

      ..WHERE (

      (CONVERT(char(8), Von, 108) BETWEEN '00:00:00' AND '23:59:59'
      AND CONVERT(char(8), Bis, 108) BETWEEN '00:00:00' AND '23:59:59')
       OR
         (CONVERT(char(8), Von, 108) BETWEEN '00:00:00' AND '23:59:59'
      AND Bis Is Null)

      AND
         (
         (Von BETWEEN '14.12.2005 00:00:00' AND '22.12.2005 23:59:59' AND Bis BETWEEN '14.12.2005' AND '22.12.2005')
         OR
         (Von BETWEEN '14.12.2005' AND '22.12.2005' AND Bis Is Null)))

      Danke!

      1. Hallo Sonic,

        Kannst du mal gucken, ob es so richtig ist?

        ich fürchte, es ist immer noch Dein Problem, nur bestimmte Stunden in einem bestimmten Datumsbereich auszuwählen, richtig?

        (CONVERT(char(8), Von, 108) BETWEEN '00:00:00' AND '23:59:59'

        Überlege Dir: Mit CONVERT wandelst Du hier ein Datum um in eine Zeichenkette. Between vergleicht in diesem Fall Zeichenketten miteinander, während Du eher Zeiten miteinander vergleichen möchtest. Ich denke Du wärst hier mit DATEPART besser bedient als mit CONVERT.

        (Von BETWEEN '14.12.2005 00:00:00' AND '22.12.2005 23:59:59' AND Bis BETWEEN '14.12.2005' AND '22.12.2005')

        hier hingegen sollte BETWEEN so arbeiten, wie Du Dir dies vorstellst.

        Freundliche Grüße

        Vinzenz

        1. Überlege Dir: Mit CONVERT wandelst Du hier ein Datum um in eine Zeichenkette. Between vergleicht in diesem Fall Zeichenketten miteinander, während Du eher Zeiten miteinander vergleichen möchtest. Ich denke Du wärst hier mit DATEPART besser bedient als mit CONVERT.

          Ich habe jetzt ein paar mehr Klammern eingefügt und siehe, es funktioniert. Alle möglichen Eingaben getestet - funktioniert, auch mit CONVERT!

      2. Ich glaube, ich habs hingekriegt. Es fehlten ein paar Klammern :)