Мои комментарии из-под вопроса стоят на этом, но повторять их: не используйте char
для хранения значений даты и времени. Использование неправильного типа данных может (и будет) вызывать проблемы. Вы должны использовать соответствующий тип данных (в данном случае time
), и ваш уровень представления должен обрабатывать форматирование.
Во-первых, однако, чтобы явно ответить на ваш вопрос, вы утверждаете, что вам нужен формат HH:MM AM/PM
,Это означает, что вы можете использовать выражение LIKE
:
SELECT TimeColumn
FROM YourTable
WHERE TimeColumn NOT LIKE '[0-1][0-9]:[0-5][0-9] [AP]M';
Это, тем не менее, имеет недостатки, поскольку допускает значение типа '19:00 AM'
. Таким образом, вы могли бы быть более конкретным и сделать это:
SELECT TimeColumn
FROM YourTable
WHERE TimeColumn NOT LIKE '0[0-9]:[0-5][0-9] [AP]M'
AND TimeColumn NOT LIKE '1[0-2]:[0-5][0-9] [AP]M';
Лично я бы на самом деле добавил выше, как CHECK CONSTRAINT
, чтобы остановить вставку неверных данных, но вам нужно будет исправить данныево-первых:
ALTER TABLE YourTable
ADD CONSTRAINT ck_ValidTime
CHECK (TimeColumn NOT LIKE '0[0-9]:[0-5][0-9] [AP]M' AND TimeColumn NOT LIKE '1[0-2]:[0-5][0-9] [AP]M');
Но, как я уже сказал, вы действительно можете исправить тип данных. Сначала я добавлю новый столбец для хранения старых данных:
ALTER TABLE YourTable ADD TimeStringColumn char(8);
GO
UPDATE YourTable SET TimeStringColumn = TimeColumn;
Затем исправьте значения вашего столбца и измените тип данных:
UPDATE YourTable SET TimeColumn = TRY_CONVERT(char(8),TRY_CONVERT(time,'12:17 AM'),114);
ALTER TABLE YourTable ALTER COLUMN TimeColumn time(0);
Если вам нужна одна веская причинапочему вам нужно изменить тип данных, в соответствии с вашими данными '12:58 AM'
равно после '10:01 PM'
.