#azure-data-factory #azure-data-factory-2 #sqldatatypes #azure-data-flow
Вопрос:
База данных SQL server имеет тип данных столбца времени
[время начала] время РАВНО НУЛЮ, [время окончания] время РАВНО НУЛЮ,
но в потоках данных для этого нет функции. Единственный способ, который я могу придумать для этого, — это запрос post (если вы полностью воссоздадите таблицу).
alter table dbo.[testTable]
alter column [start_time] time(0)
alter column [end_time] time(0)
Я попытался использовать метку времени, но опять же это не соответствующий тип данных
Метка времени(подстрока(дата начала,12,9),’ЧЧ:мм:сс’)
так что это не сработает.
Любая помощь в понимании этого была бы отличной
** обновление с помощью снимков экранов, поэтому эта проблема относится к таблицам базы данных parquet или csv в Sql.
если у вас есть столбец, который выглядит как дата-время, вам нужно сохранить его в виде строки, так как функции ToDateTime нет, есть только отметка времени. Ни строка, ни метка времени не могут быть преобразованы в тип данных DateTime в приемнике SQLdb. В итоге в вашей колонке появятся нули
Пример использования выражения для изменения даты начала на гггг-мм-дд ЧТ:мм:сс
Ответ №1:
Вы можете просто сопоставить столбец ДАТЫ и времени с целевым столбцом ВРЕМЕНИ в действии приемника.
Убедитесь, что опция «Разрешить смещение схемы» в действии приемника снята.
Моя схема тестирования:
-- source table
DROP TABLE IF EXISTS [dbo].[tempSourceTable]
CREATE TABLE [dbo].[tempSourceTable](
[id] int IDENTITY(1,1) NOT NULL,
[key] nvarchar(max) NULL,
[start_date] datetime NULL
)
INSERT INTO [dbo].[tempSourceTable] VALUES ('key1', '2021-10-14 12:34:56')
SELECT * FROM [dbo].[tempSourceTable]
-- target table
DROP TABLE IF EXISTS [dbo].[tempTargetTable]
CREATE TABLE [dbo].[tempTargetTable](
[id] int IDENTITY(1,1) NOT NULL,
[key] nvarchar(max) NULL,
[start_time] time NULL
)
Комментарии:
1. Привет, спасибо за быстрый ответ, и я вижу, что вы сделали здесь правильно. Работает ли это только с потоком данных от таблицы к таблице базы данных? Пример:- мой столбец start_date находится в строковом формате .csv ’04/10/2021 11:30:53′ вы не можете просто установить его на дату, так как он будет усечен до даты и будет показывать значение null что-либо еще.
2. Было бы здорово, если бы вы могли предоставить образец CSV, чтобы мы могли глубже изучить его, чтобы понять, чем мы можем помочь 🙂
3. Выполнено. 🙂 Пожалуйста, посмотрите мой отредактированный пост. спасибо вам за вашу помощь. В идеале просто иметь столбец datetime в файле и загружать его в SQL DateTime-идеальный сценарий
4. Я добавил еще один ответ, используя ваш пример CSV в качестве входных данных. Если новый ответ-это то, что вы ищете, я удалю этот старый ответ и сохраню только новый. 🙂
Ответ №2:
Вот мой тестовый ввод CSV:
start_date,end_date,start_date_time,end_date_time,start_time,end_time
09/01/2020,09/01/2020,09/01/2020 11:01,09/01/2020 11:01,11:01:46,11:01:52
09/01/2020,,09/01/2020 11:01,,11:01:47,
09/01/2020,09/01/2020,09/01/2020 11:01,09/01/2020 11:50,11:01:49,11:50:41
09/01/2020,09/01/2020,09/01/2020 11:01,09/01/2020 11:01,11:01:51,11:01:55
09/01/2020,09/01/2020,09/01/2020 11:01,09/01/2020 11:01,11:01:52,11:01:56
Вы можете указать формат данных/времени/даты-времени для исходных данных CSV:
Вы можете увидеть правильный результат анализа в предварительном просмотре данных:
После этого простое действие приемника должно достичь того, что хочет сделать ОП:
Схема таблицы приемника, которую я использовал для тестирования:
CREATE TABLE [dbo].[tempTargetTable](
[start_date] date NULL,
[end_date] date NULL,
[start_date_time] datetime NULL,
[end_date_time] datetime NULL,
[start_time] time NULL,
[end_time] time NULL
)