Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Изменение типа атрибута (VARCHAR в DATETIME)  [new]
EvgenSanich
Member

Откуда:
Сообщений: 3
Доброго времени суток, Господа!

Подскажите пожалуйста, возможные варианты решения следующей задачи. Из лог-файла (формат *.csv) загружаю данные в таблицу БД MS SQL для последующего анализа. Загрузку делаю с помощью скрипта (в данном случае не использую матер импорта), создаю таблицу с атрибутами типа VARCHAR и данные успешно импортируются в нее.

Далее, мне необходимо изменить типа атрибута (VARCHAR) для столбца "EventDateTime" на тип DATETIME. После импорта данных из лог-файла, записи в данном столбце имеют вид: 07.06.2019 9:10:40

Запрос на изменение типа следующий:

ALTER TABLE MyLogDB.dbo.MyLog ALTER COLUMN EventDateTime DATETIME


Результат запроса:

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

Правильно я понимаю, что записи не соответствуют формату требуемого типа, в моем случае это DATETIME?

Следовательно, перед тем как выполнить запрос на изменение типа аргумента (VARCHAR в DATETIME), необходимо изменить (преобразовать) записи в столбце "EventDateTime", то есть привести в определенный вид, удалить все точки и что то еще... Вот собственно тут у меня и возникает вопрос, что можно сделать?

Заранее благодарю за помощь!
2 авг 19, 13:02    [21940614]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
invm
Member

Откуда: Москва
Сообщений: 8845
set language russian;
ALTER TABLE MyLogDB.dbo.MyLog ALTER COLUMN EventDateTime DATETIME
2 авг 19, 13:16    [21940636]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
aleks222
Member

Откуда:
Сообщений: 760
Никогда так не делай

set language german;
ALTER TABLE MyLogDB.dbo.MyLog ALTER COLUMN EventDateTime DATETIME


Конвертировать надо ЯВНО.
convert( datetime, '07.06.2019 9:10:40', 104)
2 авг 19, 13:18    [21940641]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
londinium
Member

Откуда: Киев
Сообщений: 1116
Отконвертировать можно как-то так:
WITH CTE AS
(
   SELECT '07.06.2019 9:10:40'AS TT
    UNION ALL
   SELECT '01.08.2019 7:23:18'AS TT
)
SELECT C.TT,CONVERT(DATE,C.TT,104)AS Conv
FROM CTE AS C;
2 авг 19, 13:20    [21940645]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
iap
Member

Откуда: Москва
Сообщений: 46897
londinium
Отконвертировать можно как-то так:
WITH CTE AS
(
   SELECT '07.06.2019 9:10:40'AS TT
    UNION ALL
   SELECT '01.08.2019 7:23:18'AS TT
)
SELECT C.TT,CONVERT(DATE,C.TT,104)AS Conv
FROM CTE AS C;
Только не к типу DATE!
2 авг 19, 13:33    [21940668]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
invm
Member

Откуда: Москва
Сообщений: 8845
aleks222
Конвертировать надо ЯВНО.
Вместо одного alter, зафигачить два. Плюс update, плюс переименование столбца.
Гениально!
2 авг 19, 14:35    [21940729]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36501
invm
aleks222
Конвертировать надо ЯВНО.
Вместо одного alter, зафигачить два. Плюс update, плюс переименование столбца.
Гениально!
И все это вместо того, чтобы сконвертировать дату еще до вставки.
2 авг 19, 15:03    [21940753]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6955
EvgenSanich,

PARSE ( string_value AS data_type [ USING culture ] )
2 авг 19, 15:46    [21940795]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
Gator
Member

Откуда: Москва
Сообщений: 14978
Гавриленко Сергей Алексеевич]И все это вместо того, чтобы сконвертировать дату еще до вставки.

Да да да!
Определиться с форматами до и после.
А то непонятно, это первое августа или 8 января.
2 авг 19, 20:37    [21940993]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
aleks222
Member

Откуда:
Сообщений: 760
Гавриленко Сергей Алексеевич
invm
пропущено...
Вместо одного alter, зафигачить два. Плюс update, плюс переименование столбца.
Гениально!
И все это вместо того, чтобы сконвертировать дату еще до вставки.

До вставки - лучше.
Но засада, если есть кривые даты.
И есть желание их сберечь.
3 авг 19, 11:07    [21941110]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
EvgenSanich
Member

Откуда:
Сообщений: 3
Товарищи, пытаюсь осмыслить конструкцию и не пойму, каким образом ее применить для всех значений определенного столбца в таблице:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )


Пробовал проделать для отдельно взятого значения:

DECLARE @testval varchar(255);
SET @testval = '07.06.2019 10:00:47';
SELECT CAST(@testval AS datetime)


Результат в целом себя оправдывает, но как запилить целостную конструкцию для всего столбца, not understand:(
4 авг 19, 13:43    [21941527]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
EvgenSanich
Member

Откуда:
Сообщений: 3
EvgenSanich,

эта милая строчка
SELECT CAST(MyTable AS TIME) FROM MyLog
выдает такую ошибку:

Ошибка преобразования даты или времени из символьной строки.
4 авг 19, 13:58    [21941534]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
iap
Member

Откуда: Москва
Сообщений: 46897
EvgenSanich
EvgenSanich,

эта милая строчка
SELECT CAST(MyTable AS TIME) FROM MyLog

выдает такую ошибку:

Ошибка преобразования даты или времени из символьной строки.
Интересно. Пытаетесь осмыслить CONVERT (так и надо!), а применяете CAST!

Рассмотрите также TRY_CONVERT() в последних версиях MSSQL.
Для разбирательства с ошибочным написанием исходных дат.
4 авг 19, 15:32    [21941571]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типа атрибута (VARCHAR в DATETIME)  [new]
iap
Member

Откуда: Москва
Сообщений: 46897
iap
EvgenSanich
EvgenSanich,

эта милая строчка
SELECT CAST(MyTable AS TIME) FROM MyLog


выдает такую ошибку:

Ошибка преобразования даты или времени из символьной строки.
Интересно. Пытаетесь осмыслить CONVERT (так и надо!), а применяете CAST!

Рассмотрите также TRY_CONVERT() в последних версиях MSSQL.
Для разбирательства с ошибочным написанием исходных дат.
Однако, MyTable (очень подозрительное для времени имя!) какого типа?
И в каком виде там хранится время?
4 авг 19, 15:34    [21941573]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить