Announcement

Collapse
No announcement yet.

varchar to date

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

  • varchar to date

    Hallo,

    da ich nach langer Suche noch nicht wirklich zu einem Ergebnis gekommen bin,
    wollte ich mal in die Runde fragen.

    Leider wurde bei uns eine Tabelle aufgebaut, in der das Datum als varchar in folgendem Format abgespeichert wird: "Friday 14 August 2009"

    Wie ist es möglich innerhalb einer SELECT Anfrage dieses Datum in einen datewert zu konvertieren, um eine vergleichende Operation durchzuführen.

    Ich habe jetzt schon eine Menge mit CAST und CONVERT rumgespielt, aber komme nicht auf eine Lösung.

    Ist es überhaupt möglich?

    Dankeschön
    Zuletzt editiert von rubot; 18.08.2009, 12:51.

  • #2
    In so einem Fall ist es wohl am einfachsten, man schreibt sich eine UDF, der man den String als Eingangsparameter mitgibt und als Ergebnis ein DateTime erhält, oder was immer man möchte. Eine UDF ist ähnlich einer stored procedure, nur dass man sie auch in einem SELECT verwenden kann. Hier ein Einstieg:

    http://www.sqlteam.com/article/user-defined-functions

    Würde noch empfehlen nach "tsql user defined functions" googeln, da gibt's X Artikel dazu

    bye,
    Helmut

    Comment


    • #3
      Danke Ich schau mir das mal an...

      Comment


      • #4
        Hallo rubot,

        das die Wochentag-Bezeichnung mit drin steht, macht es nicht gerade einfacher; dafür gibt es AFAIK kein definiertes Format für die Konvertierung.

        Aber Du könntest, wie Helmut erwähnte, eine UDF erstellen, die die Bezeichnung vorne abschneidet und dann konvertiert; hier ein kleines Beispiel dazu:
        [highlight=SQL]DECLARE @date varchar(100);
        SET @date = 'Friday 14 August 2009'

        SELECT SUBSTRING(@date, CHARINDEX(' ', @date) + 1, LEN(@date));
        SELECT CONVERT(datetime,
        SUBSTRING(@date,
        CHARINDEX(' ', @date) + 1,
        LEN(@date)),
        113)[/highlight]
        Ergebnis:
        [highlight=code]
        -----------------------
        14 August 2009

        -----------------------
        2009-08-14 00:00:00.000
        [/highlight]
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Vielen Dank für die Infos,

          leider habe ich keine Rechte auf der DB UDFs anzulegen. Eventuell kann ich sie mir die Tage geben lassen.

          Bis dahin wollte ich es so ausprobieren und stolpere unglücklicherweise über Anfängerfehler

          Code:
          SELECT     *
          FROM  table
          WHERE CONVERT(datetime, SUBSTRING(date, CHARINDEX(' ', date) + 1, LEN(date))
          BETWEEN '11.08.2009' AND '13.09.2009')
          Funktioniert nicht, weil wahrscheinlich die Convertfunktion noch nicht berechnet ist? zum Zeitpunkt des Vergleiches?

          Das Dateadd/datediff hat leider nicht bewirkt, dass der timewert abgeschnitten wurde.

          Falls ihr noch einen Hinweis habt ich mich.

          Danke
          Grüße,
          Ruben

          Comment


          • #6
            Originally posted by rubot View Post
            Vielen Dank für die Infos,

            leider habe ich keine Rechte auf der DB UDFs anzulegen. Eventuell kann ich sie mir die Tage geben lassen.

            Bis dahin wollte ich es so ausprobieren und stolpere unglücklicherweise über Anfängerfehler

            Code:
            SELECT     *
            FROM  table
            WHERE CONVERT(datetime, SUBSTRING(date, CHARINDEX(' ', date) + 1, LEN(date))
            BETWEEN '11.08.2009' AND '13.09.2009')
            Funktioniert nicht, weil wahrscheinlich die Convertfunktion noch nicht berechnet ist? zum Zeitpunkt des Vergleiches?

            Das Dateadd/datediff hat leider nicht bewirkt, dass der timewert abgeschnitten wurde.

            Falls ihr noch einen Hinweis habt ich mich.

            Danke
            Grüße,
            Ruben
            Das Convert muß erstmal mit einer Klammer abgeschlossen werden (Zeile 4)
            und am besten die Datümer beim BETWEEN auch in DATETIME konvertieren
            [HIGHLIGHT="SQL"]SELECT *
            FROM table
            WHERE CONVERT(datetime, SUBSTRING(date, CHARINDEX(' ', date) + 1, LEN(date))
            )
            BETWEEN CONVERT (DATETIME, '11.08.2009' , 104) AND
            CONVERT (DATETIME, '13.09.2009' , 104)[/HIGHLIGHT]

            Comment


            • #7
              Vielen Dank. Genau das habe ich gebraucht

              Comment

              Working...
              X