none
Datum (varchar) Differenz in monaten RRS feed

  • Frage

  • Hallo,

    ich habe in meiner Datenbank eine Spalte [WarrantyEndDate] (varchar(128)). Dort stehen bekannte Daten als: "07.04.2011" und unbekannte (früher NULL oder leer) als "unknown"

    Nun möchte ich alle [WarrantyEndDate] die z.B. noch mindestens 5 Monate gültig sind (z.B. 22.05.2015) haben.

    Mein bisheriger versuch sieht so aus:

    SELECT WarrantyEndDate FROM [PC_3.1] WHERE [WarrantyEndDate] NOT LIKE 'unknown' AND CONVERT(datetime,[WarrantyEndDate], 104) > DATEADD(month, 5, GETDATE())

    Leider sagt er mir immer "Conversion failed when converting date and/or time from character string."

    Ich benutze MS SQL Server Management Studio (SQL Server 2008)

    lg Zuyas

    Mittwoch, 31. Juli 2013 13:30

Antworten

  • Hab es hinbekommen:

    SELECT WarrantyEndDate FROM [PC_3.1] WHERE [WarrantyEndDate] NOT LIKE 'unknown' AND DATEADD(month, 5, GETDATE()) < (CASE WHEN [WarrantyEndDate] != 'unknown' THEN CONVERT(datetime,[WarrantyEndDate], 104) ELSE '%' END) 

    lg Zuyas

    • Als Antwort markiert Zuyas Mittwoch, 31. Juli 2013 14:19
    Mittwoch, 31. Juli 2013 14:19

Alle Antworten

  • Hallo Zuyas,

    besser wäre es die Daten im ISO-Format zu speichern, also z. b. '2015-02-22'.

    Du könntest die Konvertierung nach DATE machen, oder den String zerpflücken:

    convert(date,substring(WarrantyEndDate,7,4)+ substring(WarrantyEndDate,4,2)+ substring(WarrantyEndDate,1,2),104)


    Einen schönen Tag noch,
    Christoph Muthmann
    Microsoft SQL Server MVP - Blog


    Mittwoch, 31. Juli 2013 13:56
  • Hallo Christoph,

    vielen Dank für deine Antwort.

    Leider ist es mir nicht Möglich irgendwas an den Daten zu ändern. Die werden so importiert und müssen später beim Export auch so wieder zurück. 

    Ich denke das Problem liegt darin, dass er bei:

    ... AND CONVERT(datetime,[WarrantyEndDate], 104) > DATEADD(month, 5, GETDATE())

    versucht die 'unknown' umzuwandeln. Kann ich ihm nicht sagen das er die ignorieren soll?

    Bin noch nicht so gut im Umgang mit SQL aber müsste das nicht mit einem subquery zu lösen sein? 

    lg Zuyas

    Mittwoch, 31. Juli 2013 14:12
  • Hab es hinbekommen:

    SELECT WarrantyEndDate FROM [PC_3.1] WHERE [WarrantyEndDate] NOT LIKE 'unknown' AND DATEADD(month, 5, GETDATE()) < (CASE WHEN [WarrantyEndDate] != 'unknown' THEN CONVERT(datetime,[WarrantyEndDate], 104) ELSE '%' END) 

    lg Zuyas

    • Als Antwort markiert Zuyas Mittwoch, 31. Juli 2013 14:19
    Mittwoch, 31. Juli 2013 14:19
  • [WarrantyEndDate] NOT LIKE 'unknown' AND .... 

    Hallo Ig,

    also steht im Feld "WarrantyEndDate" nicht nur textuelle Datumswerte, sondern auch Begriffe wie "unknown"? Dann wirst Du das Problem noch häufiger bekommen. Besser wäre es, Datumswerte auch in einem Feld vom Type datetime oder date zu speichern; un statt "unknown" last man den Wert dann auf NULL.


    Olaf Helper

    Blog Xing

    • Als Antwort markiert Zuyas Donnerstag, 1. August 2013 11:18
    • Tag als Antwort aufgehoben Zuyas Donnerstag, 1. August 2013 11:18
    Donnerstag, 1. August 2013 04:34