Преобразование значений varchar, полученных из постоянного поля, в месяц и год - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть запрос, в котором я извлекаю определенный текст из строки.Пример строки:

"Захваченная кредитная карта: MasterCard, xxxx-xxxx-xxxx-xxxx, 09/19. Установить по умолчанию."

Мой запрос тянет месяц истеченияи год из этого текста.

SUBSTRING(ADT.MsgText, CHARINDEX('/', ADT.MsgText, 0) -2, 2) AS [Month]
,'20' + SUBSTRING(ADT.MsgText, CHARINDEX('/', ADT.MsgText, 0) + 1, 2) AS [Year]

Однако мне нужно, чтобы эти числовые значения были распознаны как значения даты.Я попробовал следующий метод, но безуспешно:

UPDATE CCC
SET CCC.[Month] = convert(date, convert(varchar(4), CCC.[Year]) + ' ' + convert(varchar(2), CCC.[Month]))
FROM CC_Captured CCC

Полученное сообщение об ошибке: «Не удалось обновить или вставить представление или функцию« CCC », так как оно содержит производное или постоянное поле».

Мне интересно, как преобразовать эти значения в дату?Любая помощь приветствуется!

(также я использую SQL 2016)

1 Ответ

0 голосов
/ 16 ноября 2018

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

declare @MsgText nvarchar(1000) = N'Captured Credit Card: MasterCard, xxxx-xxxx-xxxx-xxxx, 09/19. Set as Default.'
select SUBSTRING(@MsgText, CHARINDEX('/', @MsgText, 0) -2, 2) AS [Month]
,'20' + SUBSTRING(@MsgText, CHARINDEX('/', @MsgText, 0) + 1, 2) AS [Year]
-- First day of the month
select DATEFROMPARTS(CAST('20' + SUBSTRING(@MsgText, CHARINDEX('/', @MsgText, 0) + 1, 2) as int), CAST(SUBSTRING(@MsgText, CHARINDEX('/', @MsgText, 0) -2, 2) as int), 1) as FirstDayOfMonth
-- Last day of the month - add 1 month to the date above and go back 1 day
select DATEADD(day, -1, DATEADD(month, 1, DATEFROMPARTS(CAST('20' + SUBSTRING(@MsgText, CHARINDEX('/', @MsgText, 0) + 1, 2) as int), CAST(SUBSTRING(@MsgText, CHARINDEX('/', @MsgText, 0) -2, 2) as int), 1))) as EndOfMonth

Или, что еще лучше, используйте функцию EOMONTH :

select EOMONTH(DATEFROMPARTS(CAST('20' + SUBSTRING(@MsgText, CHARINDEX('/', @MsgText, 0) + 1, 2) as int), CAST(SUBSTRING(@MsgText, CHARINDEX('/', @MsgText, 0) -2, 2) as int), 1)) as EndOfMonth
...