Иметь поле, которое является временем, нужно найти те, которые находятся вне формата ЧЧ: ММ AM / ЧЧ: ММ PM - PullRequest
0 голосов
/ 28 октября 2019

Я просматриваю таблицу, в которой есть время от времени для часов, в которые определенное предприятие открыто в таблице SQL Server, и данные вводятся в формате char, а не в формате времени. Это должно быть в 12-часовом формате ММ: ЧЧ AM или PM. Там много не введено с правильным форматом времени. Как я могу создать заявление Case или что-то, чтобы поймать их в неправильном формате.

Я ничего не пробовал, не знаю с чего начать.

Нет кода для показа

Я ожидал бы, например, 8 утра или 23:59, чтобы показатьвверх в столбце оператора case с любым сообщением об ошибке.

1 Ответ

1 голос
/ 28 октября 2019

Мои комментарии из-под вопроса стоят на этом, но повторять их: не используйте 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'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...