Фильтровать столбец nvarchar по тому, может ли значение быть приведено как дата?

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть таблица базы данных, чей ETL-процесс и содержимое, которые я не могу изменить, со nvarchar столбцом, который в основном состоит из строк даты и null. Тем не менее, иногда появляются ‘N / A’ или ‘Не принято’.

Есть ли способ получить только те значения, которые являются допустимыми строками даты?

ВВОД:

 2019-01-01
N/A
null
2019-03-04
  

ВЫВОД

 2019-01-01
2019-03-04
  

Комментарии:

1. ПОПРОБУЙ РАЗОБРАТЬ? learn.microsoft.com/en-us/sql/t-sql/functions /…

2. Обратите внимание, что при этом не используется индекс, не подлежащий проверке. ПЛОХАЯ производительность. Сработал бы Try_parse в функции для поля, которое затем индексируется.

3. Давайте не будем ходить вокруг да около, хотя исправление самих данных (изменение их на date ) является реальным решением здесь. Оба приведенных вами примера имеют формат yyyy-MM-dd , но я бы не удивился, что у вас есть такие значения, как 01/02/03 , и вам будет больно, если это так.

4. @Larnu Я согласен, но это сторонняя база данных, и они уже сказали мне, что не будут ее исправлять.

5. «Не буду» не означает «не должен» или «не могу». Я бы лично настаивал на том, чтобы третья сторона исправила это; это не «особенность», это ошибка, и в связи с этим я бы обратился в службу поддержки.

Ответ №1:

Простой способ использует try_cast() или try_convert() :

 select t.*
from t
where try_cast(datecol as date) is not null;