Przechowywanie wartości dat jako varchar jest po prostu nieprawidłowe.
Jeśli to możliwe, powinieneś zmienić tabelę, aby przechowywać je jako dane typu data.
Możesz to zrobić w kilku prostych krokach:
-
Zmień nazwę bieżących kolumn (zgaduję, że DataRozpoczęcia Harmonogramu jest również varchar) na columnName_old. Można to łatwo zrobić za pomocą
sp_rename
. -
Użyj
alter table
aby dodać kolumny z odpowiednim typem danych. - Skopiuj wartości ze starych kolumn do nowych kolumn za pomocą instrukcji aktualizacji. Ponieważ wszystkie daty są przechowywane w tym samym formacie, możesz użyć
convert
w ten sposób:set ScheduleStartDate = convert(date, NULLIF(ltrim(rtrim(ScheduleStartDate_old)), ''), 103)
Jeśli twoja wersja serwera sql to 2012 lub nowsza, użyjtry_convert
. Zauważ, że użyłemnullif
,ltrim
irtrim
konwertować wartości zawierające tylko spacje na null. - Upuść i ponownie utwórz indeksy odwołujące się do tych kolumn. Najprostszym sposobem na to jest kliknięcie prawym przyciskiem myszy indeksu w SSMS i wybranie
script index as
->drop and create
. - Użyj
alter table
aby usunąć stare kolumny.
Uwaga: jeśli do tych kolumn odwołuje się jakikolwiek inny obiekt w bazie danych, będziesz musiał również zmienić te obiekty. Obejmuje to procedury składowane, klucze obce itp.
Jeśli nie możesz zmienić typów danych kolumn, a twoja wersja serwera sql jest niższa niż 2012, musisz użyć konwersji w ten sposób:
SELECT * FROM tblServiceUsersSchedule
WHERE CONVERT(DATE, NULLIF(ScheduleEndDate, RTRIM(LTRIM('')), 103)
< CAST(GETDATE() As Date);
AND ScheduleEndDate IS NOT NULL
Pamiętaj, że jeśli masz nawet jeden wiersz, w którym dane kolumny nie są w formacie dd/MM/rrrr, spowoduje to zgłoszenie błędu.
W przypadku wersji serwera sql 2012 lub nowszych użyj Try_convert
. Ta funkcja po prostu zwróci wartość null, jeśli konwersja się nie powiedzie:
SELECT * FROM tblServiceUsersSchedule
WHERE TRY_CONVERT(DATE, NULLIF(ScheduleEndDate, RTRIM(LTRIM('')), 103)
< CAST(GETDATE() As Date);
AND ScheduleEndDate IS NOT NULL
Uwaga: Użyłem CAST(GETDATE() as Date)
aby usunąć część czasu z bieżącej daty. Oznacza to, że otrzymasz tylko rekordy, w których ScheduleEndDate
ma co najmniej jeden dzień. Jeśli chcesz również uzyskać rekordy, w których ScheduleEndDate
jest dzisiaj, użyj <=
zamiast <
.
Ostatnia rzecz: Używanie funkcji na kolumnach w klauzuli WHERE uniemożliwi Sql Server użycie indeksowania tych kolumn.
To kolejny powód, dla którego powinieneś zmienić kolumny na odpowiedni typ danych.