Vergleich von gespeicherten Daten als varchar
Ich brauche zum vergleichen von Daten, die gespeichert sind in meine Datenbank als varchar gegen das heutige Datum.
Speziell, ich brauche, um auszuschließen, werden alle Datensätze mit einem Datum vergangen ist.
Habe ich versucht:
SELECT * FROM tblServiceUsersSchedule
WHERE ScheduleEndDate !='' AND ScheduleEndDate < '2015/05/31'
Diese ausgewählten Werte wie 17/06/2012 und 19/04/2015, die beide bereits übergeben, zusammen mit 01/06/2015 welche nicht.
Ich habe dann versucht, Stimmen die Daten mit:
SELECT *
FROM tblServiceUsersSchedule
WHERE CAST(ScheduleEndDate as DATETIME) < CAST('05/31/2015' as DATETIME) AND ScheduleEndDate !='' AND ScheduleEndDate is not null
Bekam aber folgenden Fehler:
Die coversion eines varchar-Datentyps in einen datetime-Datentyp führte
in einer out-of-range-Wert.
Ich die Daten überprüft hat, hinter sich und keine null, keine leere weiße Fläche. Alle Datumsangaben im format TT/mm/JJJJ.
Ich kann nicht herausfinden, wie zu vergleichen, die varchar Datum gespeichert mit dem heutigen Datum.
- Sie erklärt haben, genau die Art von problem, warum die Speicherung von Daten, die als eine
varchar
ist eine schreckliche Praxis. Sollten Sie aktualisieren Sie Ihre Datenbank-schema zu verwendendate
,datetime
,datetime2
oderdatetimeoffset
als angemessen. Jede Antwort, die unten gegeben werden, auch diejenigen, die arbeiten, wird das Ergebnis in eine non-sargable Abfragen - das bedeutet, Sie können verwenden einen index. Je größer die Tabelle, desto schlechter wird die Leistung - wie es immer zu prüfen, jede Zeile der Tabelle zur Beantwortung Ihrer Anfrage. Verwenden Sie die richtige Art und vermeiden das problem. - Ich habe mich entschieden, varchar, wie manchmal das Datum 01/01/1900 (oder so ähnlich) eingefügt würde. Ich wusste, es war nicht ideal an der Zeit, aber fühlt sich irgendwie gebunden, um es jetzt
- Ich bin mir nicht sicher, warum Sie denken, würde eine
date
Spalte nicht halten konnten01/01/1900
. Oder wenn Sie bedeutet, dass müssen Sie möglicherweise einen nicht-Wert, das ist es, wasnullable
Spalten sind für.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Speicherung von Datum-Werte als varchar ist einfach falsch.
Wenn möglich, sollten Sie ändern Sie die Tabelle, um Sie zu speichern als date-Datentyp.
Sie können es in wenigen, einfachen Schritten:
Benennen Sie die aktuellen Spalten (ich vermute ScheduleStartDate ist auch varchar) zu columnName_old. Dies kann leicht getan werden, indem mit
sp_rename
.Verwenden
alter table
zum hinzufügen von Spalten mit den entsprechenden Daten-Typ.convert
wie diese:set ScheduleStartDate = convert(date, NULLIF(ltrim(rtrim(ScheduleStartDate_old)), ''), 103)
Wenn Ihre sql server-version 2012 oder höher, verwenden Sietry_convert
. Hinweis: ich habe dienullif
,ltrim
undtrim
zu konvertieren, Werte, enthält nur Leerzeichen zu null.script index as
->drop and create
.alter table
zum entfernen der alten Spalten.Hinweis: wenn diese Spalten werden verwiesen in andere Objekte auf der Datenbank müssen Sie diese Objekte auch. Dies beinhaltet stored procedures, foreign keys etc`.
Wenn Sie nicht ändern können, die Daten-Typen der Säulen, und Ihre sql server-version ist niedriger als 2012, die Sie verwenden müssen, konvertieren wie diese:
Beachten Sie, dass wenn Sie auch nur eine einzige Zeile, wo die Spalte ist, die Daten nicht in dd/MM/yyyy format in diesem wird ein Fehler ausgelöst.
Für sql server-Versionen 2012 oder höher, verwenden Sie
Try_convert
. Diese Funktion wird einfach null zurück, wenn die Konvertierung fehlschlägt:Hinweis: ich habe
CAST(GETDATE() as Date)
zu entfernen, die mal Teil des aktuellen Datums. Dies bedeutet, dass Sie nur Datensätze, in denen dieScheduleEndDate
ist mindestens einen Tag alt. Wenn Sie wollen auch Holen Sie sich die Datensätze, in denen dieScheduleEndDate
heute ist, verwenden<=
statt<
.Eine Letzte Sache: Verwendung von Funktionen auf Spalten in der where-Klausel verhindern, dass Sql Server zu verwenden Indizierung auf diese Spalten.
Dies ist ein weiterer Grund, warum sollten Sie Ihre Spalten mit den entsprechenden Daten-Typ.
Andere als das, was die Menschen haben bereits vorgeschlagen, dass Sie sollte nie speichern
DATETIME
alsVARCHAR
. Immer speichern Sie es in einemDATETIME
Spalte Typ; ich denke, Sie sollten Ihren Zustand inWHERE
Zu diesem, um sich alle Termine, die noch nicht bestanden noch
Ihre Abfrage sollte so Aussehen wie