Выберите дату в строке и конвертируйте ее в datetime - PullRequest
0 голосов
/ 31 марта 2020

У меня есть строка вроде:

'SPY US 03/20/20 P45'

Я хочу выбрать только дату из строки.

Мой текущий запрос:

Select Ticker, SUBSTRING(Ticker, PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9]%',o.Ticker),8) AS 'myDate' FROM TABLE

Это возвращает: 'SPY US 03/20/20 P45', 03/20/20

Я хочу, чтобы myDate был в datetime.

Я пробовал различные морфы преобразования и преобразования, но они терпят неудачу, предположительно, потому что они хотят, чтобы формат был в ГГГГ-ММ-ДД, а не ММ / ДД / ГГ.

Моя "самая умная" попытка конвертации была такой:

CONVERT(DATETIME, SUBSTRING(o.Ticker, PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9]%',o.Ticker),8),1)

После прочтения рекомендаций по стилю здесь: https://www.w3schools.com/sql/func_sqlserver_convert.asp, но она все равно не удалась.

Идеальным конечным форматом для даты будет ГГГГ-ММ-ДД

Отредактировано, чтобы добавить:

Я возился с этим и понял, что я упростил мой вопрос. Преобразование работает, если я просто проверяю его на строке, но весь запрос включает несколько соединений.

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Получается, что в столбце было несколько записей, которые не имели дружественного формата даты, поэтому предложение patindex возвращало бессмыслицу.

По какой-то причине это привело к сбою всей операции ( вместо того, чтобы просто возвращать ноль на несколько записей, которые не удалось).

Как только я выбрал всю (в конечном счете, более сложный оператор соединения) временную таблицу, я смог попытаться преобразовать подстроку в дату и запустить мои операции.

0 голосов
/ 31 марта 2020

Насколько я понимаю, вы ищете что-то вроде этого.

Вы можете использовать функцию string_split(), чтобы разделить строку пробелом, а затем использовать функцию try_cast(), чтобы проверить каждое значение, является ли оно date.

declare @string as varchar(120) = 'SPY US 03/20/20 P4'
; with cte as (select 
  value
from string_split (@string, ' ')
)Select value from cte where try_cast (value as datetime) is not null

Live db <> fiddle demo.

...