SSIS 仅加载 Excel Sheet 的日期
SSIS Loading Just The Date From Excel Sheet
我有一个包含多个 sheet 的 Excel 文件,但只有第一个 sheet 列出了日期。我试图做的是读取 excel 文件,将其放入一个变量中,以便稍后在数据流任务中使用。
通常这将是您的 运行 工厂读写数据流任务,但由于此信息位于 excel sheet 的第一页,其中大部分信息关于该报告,它使阅读信息变得更加困难。
这是 sheet 的样子,我想从整个 sheet 中获得的唯一信息更具体地说是 Data Period 行, Dec 2016
任何方向将不胜感激,谢谢。
如果您使用 SSIS 将 "Data Period" 列的单元格内容加载到 SQL table 中,您可以轻松地将它们从 excel 日期格式转换SQL 日期格式使用以下之一:
日期和时间
select dateadd(second, (@time_xls - ROUND(@time_xls,0))*86400, dateadd(d, ROUND(@time_xls,0),'1899-12-30'))
例如值42853.4673611111被转换为“2017-04-28 11:13:00.000”
只有日期
select dateadd(d,@time_xls,'1899-12-30')
例如值36464被转换为“1999-10-31 00:00:00.000”.
Excel 工作表可以像表格一样查询。您可以使用 Execute SQL Task
来读取一系列单元格并迭代结果,或者您可以读取单个单元格,就好像它是一个范围并将其值存储在变量中。
该过程在 Read Excel Value in SSIS 中进行了描述,其中包含不少陷阱:
- 添加指向您的 Excel 文件的 Excel 连接管理器
- 将其结果类型设置为
Single Row
。
- 将查询设置为
SELECT * FROM [Sheet1$A6:A6]
。这是第一个陷阱。您不能指定列名。在数据流查询中,您可以编写 SELECT RIGHT(F1,8) FROM
[Sheet1$A6:A6]
以仅提取日期部分。这不起作用
Execute SQL Task
.
- 在
Result Set
部分,将0
结果集映射到一个新的字符串变量,例如PeriodCell
。名称必须为 0。这是第二个陷阱
- 您可以根据 returns 只有
PeriodCell
最右边的 8 个字符的表达式创建另一个变量,例如 RIGHT( @[User::PeriodCell],8)
如果您的系统使用英语语言环境,您可以将字符串直接解析为日期。在这种情况下,您可以使用表达式 (DT_DATE)RIGHT( @[User::PeriodCell],8)
创建 DateTime 变量。例如,(DT_DATE)"Dec 2016"
returns 1/1/2016
不幸的是,如果您的语言环境 不是 英语,这将不起作用,即使您更改了包的语言环境 属性。
我有一个包含多个 sheet 的 Excel 文件,但只有第一个 sheet 列出了日期。我试图做的是读取 excel 文件,将其放入一个变量中,以便稍后在数据流任务中使用。
通常这将是您的 运行 工厂读写数据流任务,但由于此信息位于 excel sheet 的第一页,其中大部分信息关于该报告,它使阅读信息变得更加困难。
这是 sheet 的样子,我想从整个 sheet 中获得的唯一信息更具体地说是 Data Period 行, Dec 2016
任何方向将不胜感激,谢谢。
如果您使用 SSIS 将 "Data Period" 列的单元格内容加载到 SQL table 中,您可以轻松地将它们从 excel 日期格式转换SQL 日期格式使用以下之一:
日期和时间
select dateadd(second, (@time_xls - ROUND(@time_xls,0))*86400, dateadd(d, ROUND(@time_xls,0),'1899-12-30'))
例如值42853.4673611111被转换为“2017-04-28 11:13:00.000”
只有日期
select dateadd(d,@time_xls,'1899-12-30')
例如值36464被转换为“1999-10-31 00:00:00.000”.
Excel 工作表可以像表格一样查询。您可以使用 Execute SQL Task
来读取一系列单元格并迭代结果,或者您可以读取单个单元格,就好像它是一个范围并将其值存储在变量中。
该过程在 Read Excel Value in SSIS 中进行了描述,其中包含不少陷阱:
- 添加指向您的 Excel 文件的 Excel 连接管理器
- 将其结果类型设置为
Single Row
。 - 将查询设置为
SELECT * FROM [Sheet1$A6:A6]
。这是第一个陷阱。您不能指定列名。在数据流查询中,您可以编写SELECT RIGHT(F1,8) FROM [Sheet1$A6:A6]
以仅提取日期部分。这不起作用Execute SQL Task
. - 在
Result Set
部分,将0
结果集映射到一个新的字符串变量,例如PeriodCell
。名称必须为 0。这是第二个陷阱 - 您可以根据 returns 只有
PeriodCell
最右边的 8 个字符的表达式创建另一个变量,例如RIGHT( @[User::PeriodCell],8)
如果您的系统使用英语语言环境,您可以将字符串直接解析为日期。在这种情况下,您可以使用表达式 (DT_DATE)RIGHT( @[User::PeriodCell],8)
创建 DateTime 变量。例如,(DT_DATE)"Dec 2016"
returns 1/1/2016
不幸的是,如果您的语言环境 不是 英语,这将不起作用,即使您更改了包的语言环境 属性。