将 Dataflows 时间列映射到 Sql 时间列

Posted

技术标签:

【中文标题】将 Dataflows 时间列映射到 Sql 时间列【英文标题】:Mapping Dataflows time column to Sql time column 【发布时间】:2021-11-24 09:05:34 【问题描述】:

SQL server db 的时间列数据类型为

[start_time] 时间 NULL, [end_time] 时间为空,

但是数据流没有这个功能。 我能想到的唯一方法是发布查询(如果您完全重新创建表)

  alter table dbo.[testTable] 
  alter column [start_time] time(0) 
  alter column [end_time] time(0) 

我尝试使用时间戳,但它再次不是匹配的数据类型

toTimestamp(substring(start_date,12,9),'HH:mm:ss')

所以这行不通。

任何有助于理解这一点的帮助都会很棒

** 更新屏幕截图 所以这个问题适用于 parquet 或 csv 到 Sql db 表。

如果您有一个看起来像 DateTime 的列,则需要将其保留为字符串,因为没有 toDateTime 函数只有 toTimestamp。在 SQLdb 接收器中,字符串或时间戳都不能转换为 DateTime 数据类型。你最终会在你的列中得到空值

使用表达式将 start_date 更改为 yyyy-mm-dd THH:mm:ss 之前的示例

【问题讨论】:

【参考方案1】:

您可以简单地将 DATETIME 列映射到接收器活动中的目标 TIME 列。

确保未选中接收器活动中的“允许架构漂移”选项。

我的测试架构:

-- 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
)

在管道中执行数据流后的结果:

【讨论】:

您好,感谢您的及时回复,我看到您在这里所做的事情是正确的。这仅适用于数据流数据库表到表吗?示例:-我的列 start_date 采用 .csv 字符串格式“04/10/2021 11:30:53”,您不能简单地将其设置为日期,因为它将被截断为日期,并且会显示其他任何内容。跨度> 如果你能提供样本 CSV 那就太好了,这样我们就可以更深入地研究它,看看我们能提供什么帮助:) 完成。 :-) 请看我编辑的帖子。感谢您的帮助。理想情况下,只要能够在文件中有一个 datetime 列并加载到 SQL DateTime 是理想的场景 我使用您的示例 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 源数据指定数据/时间/日期时间格式:

在数据预览中可以看到正确的解析结果:

之后,一个简单的接收器活动应该可以实现 OP 想要做的事情:

我用于测试的接收器表架构:

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
)

数据库中的结果:

【讨论】:

以上是关于将 Dataflows 时间列映射到 Sql 时间列的主要内容,如果未能解决你的问题,请参考以下文章

实体框架将 DateTimeOffset 映射到 SQL Server DateTime

MS SQL Server 中是不是有任何方法可以使用某种链接将表的一列映射到另一个数据库?

如何合并 SQL Server 中具有映射到通用描述的不同列标题的表?

小巧玲珑。映射到列名中带有空格的 SQL 列

将int列映射到nhibernate中的bool属性的问题

EF Core 在映射到 Select 中的对象时查询 SQL 中的所有列