Как мне преобразовать дату Varchar в фактическую дату? - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть поле с типом данных = varchar (50), и у меня есть несколько различных форматов даты, таких как:

2019-06-17
01/11/19
2019-08-21
08/04/13
10/03/17
11/22/08
2018-06-07

Я добавил новое поле в таблицу и тип данных = дата. Как я могу преобразовать все даты в поле varchar (50) в фактические даты в поле даты?

Я думал, что это будет так просто:

update TBL_MULTI_LD_Balance_HIST
set [actual_date] = CONVERT(VARCHAR(10), Date, 110)

update TBL_MULTI_LD_Balance_HIST
set [actual_date] = CAST([Date] as Date)

Но теперь я получаю эту ошибку: «Сообщение 241, Уровень 16, Состояние 1, Строка 65 Ошибка преобразования при преобразовании даты и / или времени из символьной строки. '

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018

Один из вариантов - использовать простой CASE. Однако, у вас есть неоднозначные даты, такие как 01/11/19 ... при условии, что MDY будет преобразовано в 2019-01-11

Пример

Declare @YourTable Table ([SomeCol] varchar(50),Date date )
Insert Into @YourTable Values 
 ('2019-06-17',null)
,('01/11/19',null)
,('2019-08-21',null)
,('08/04/13',null)
,('10/03/17',null)
,('11/22/08',null)
,('2018-06-07',null)
,('Not a Date',null)
,('2017-31-31',null)

Update @YourTable 
  set [Date] = case when IsDate(SomeCol)=0 then null else convert(date,SomeCol) end

Select * from @YourTable

Обновленная таблица

SomeCol     Date
2019-06-17  2019-06-17
01/11/19    2019-01-11
2019-08-21  2019-08-21
08/04/13    2013-08-04
10/03/17    2017-10-03
11/22/08    2008-11-22
2018-06-07  2018-06-07
Not a Date  NULL
2017-31-31  NULL
0 голосов
/ 26 апреля 2018

вы можете попробовать заменить все /, - и принять один и тот же формат для всех дат, а затем преобразовать.

0 голосов
/ 26 апреля 2018

Вы можете запустить

SELECT *
FROM TBL_MULTI_LD_Balance_HIST
WHERE ISDATE([date]) = 0

Это даст вам список тех, кто доставляет вам проблемы. Затем вы можете вручную исправить их и впоследствии запустить свое оригинальное обновление. Это не полная защита, но, по крайней мере, даст вам хорошую отправную точку.

0 голосов
/ 26 апреля 2018

В SQL Server 2012+ это так просто, как вы предлагаете, потому что SQL Server довольно гибок в преобразовании в даты. Но некоторые вещи не могут быть преобразованы. Вместо cast() используйте try_cast() или try_convert():

update TBL_MULTI_LD_Balance_HIST
    set [actual_date] = try_cast([Date] as Date);

Перед этим вы можете получить значения, которые не конвертируются, выполнив:

select [date]
from TBL_MULTI_LD_Balance_HIST
where try_cast([Date] as date) is null;

Если все значения соответствуют вашим форматам, у вас не будет проблем. cast() будет просто работать. Это не так, так что до 2012 года нет хорошего решения. Вы можете попробовать:

update TBL_MULTI_LD_Balance_HIST
    set [actual_date] = (case when [date] like '[0-1][0-9]/[0-3][0-9]/[0-9][0-9]'
                              then cast([Date] as Date)
                              when [date] like '[12][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]'
                              then cast([Date] as Date)
                         end);

Очевидно, что это может привести к плохим матчам, таким как 34 апреля, но обычно они не являются проблемой в этой ситуации. Люди вставляют какую-то строку, например "none".

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