Benutzer mit den meisten Antworten
Datum (varchar) Differenz in monaten

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
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
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- Bearbeitet Christoph Muthmann Mittwoch, 31. Juli 2013 13:57 Neue Idee
-
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
-
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
-
[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