SSIS仅从Excel工作表加载日期
我有一个包含多张工作表的Excel文件,但只有第一张工作表上列出了日期。我试图做的是读取excel文件,将其放入变量中,以便以后在数据流任务中使用 通常情况下,这将是您的常规读写数据流任务,但由于此信息位于excel工作表的第一页,其中包含了有关报告的大部分信息,因此读取信息会有点困难 这是这张表的样子,我想从整张表中得到的唯一信息是数据期行,更具体地说,SSIS仅从Excel工作表加载日期,excel,ssis,conditional,Excel,Ssis,Conditional,我有一个包含多张工作表的Excel文件,但只有第一张工作表上列出了日期。我试图做的是读取excel文件,将其放入变量中,以便以后在数据流任务中使用 通常情况下,这将是您的常规读写数据流任务,但由于此信息位于excel工作表的第一页,其中包含了有关报告的大部分信息,因此读取信息会有点困难 这是这张表的样子,我想从整张表中得到的唯一信息是数据期行,更具体地说,2016年12月 如有任何指示,将不胜感激,谢谢 如果已使用SSI将“数据周期”列的单元格内容加载到SQL表中,则可以使用以下选项之一轻松将
2016年12月
如有任何指示,将不胜感激,谢谢 如果已使用SSI将“数据周期”列的单元格内容加载到SQL表中,则可以使用以下选项之一轻松将其从excel日期格式转换为SQL日期格式: 日期和时间
select dateadd(second, (@time_xls - ROUND(@time_xls,0))*86400, dateadd(d, ROUND(@time_xls,0),'1899-12-30'))
select dateadd(d,@time_xls,'1899-12-30')
例如,将值42853.4673611111转换为“2017-04-28 11:13:00.000”
仅日期
select dateadd(second, (@time_xls - ROUND(@time_xls,0))*86400, dateadd(d, ROUND(@time_xls,0),'1899-12-30'))
select dateadd(d,@time_xls,'1899-12-30')
例如,值36464被转换为“1999-10-31 00:00:00.000”。如果您已使用SSI将“数据周期”列的单元格内容加载到SQL表中,则可以使用以下选项之一轻松地将其从excel日期格式转换为SQL日期格式: 日期和时间
select dateadd(second, (@time_xls - ROUND(@time_xls,0))*86400, dateadd(d, ROUND(@time_xls,0),'1899-12-30'))
select dateadd(d,@time_xls,'1899-12-30')
例如,将值42853.4673611111转换为“2017-04-28 11:13:00.000”
仅日期
select dateadd(second, (@time_xls - ROUND(@time_xls,0))*86400, dateadd(d, ROUND(@time_xls,0),'1899-12-30'))
select dateadd(d,@time_xls,'1899-12-30')
例如,值36464被转换为“1999-10-31 00:00:00.000”。可以像表格一样查询Excel表格。您可以使用
executesql任务
读取迭代结果的单元格区域,也可以像读取区域一样读取单个单元格,并将其值存储在变量中
该过程在中进行了描述,并包含了许多问题:
单行
SELECT*FROM[Sheet1$A6:A6]
。这是第一个问题。不能指定列名。在数据流查询中,您可以从
[Sheet1$A6:A6]仅提取日期部分。这不适用于任何情况
执行SQL任务
结果集
部分,将0
结果集映射到新的字符串变量,例如PeriodCell
。名称必须为0。这是第二次了PeriodCell
最右边8个字符的表达式创建另一个变量,例如RIGHT(@[User::PeriodCell],8)
(DT_DATE)RIGHT(@[User::PeriodCell],8)
创建一个DateTime变量。例如,(DT\U日期)“2016年12月”
返回1/1/2016
不幸的是,如果您的语言环境不是英语,即使您更改了包的语言环境属性,这也不起作用 可以像查询表格一样查询Excel表格。您可以使用
executesql任务
读取迭代结果的单元格区域,也可以像读取区域一样读取单个单元格,并将其值存储在变量中
该过程在中进行了描述,并包含了许多问题:
单行
SELECT*FROM[Sheet1$A6:A6]
。这是第一个问题。不能指定列名。在数据流查询中,您可以从
[Sheet1$A6:A6]仅提取日期部分。这不适用于任何情况
执行SQL任务
结果集
部分,将0
结果集映射到新的字符串变量,例如PeriodCell
。名称必须为0。这是第二次了PeriodCell
最右边8个字符的表达式创建另一个变量,例如RIGHT(@[User::PeriodCell],8)
(DT_DATE)RIGHT(@[User::PeriodCell],8)
创建一个DateTime变量。例如,(DT\U日期)“2016年12月”
返回1/1/2016
不幸的是,如果您的语言环境不是英语,即使您更改了包的语言环境属性,这也不起作用 你展示的只是文字,不是日期。该文本字段的某些部分可能包含日期,也可能不包含日期。您必须解析每个值以提取任何看起来像日期的内容,因为这是标记为excel的,我将提供一个excel解决方案。在B6中添加:
=Right(Trim(A6),8)
@PanagiotisKanavos是的,基本上我会将字符串传递到一个变量中,然后在我的派生列中使用(DT_STR,101252)year+“-”+(DT_STR,101252)month+“-31”或类似的内容来转换它。只是提取字符串是我遇到的问题。@luklag您不能在SSIS中计算Excel公式的值package@JLone您可以使用查询加载特定字段,例如SELECT*from[Sheet1$A6:A6]
,但您仍然需要处理该文本。如果您完全确定字符串将以MMM YYYY
结尾,则可以通过SQL或SSIS派生列公式返回最后8个字符。您不需要将字符串转换为YYYY-MM-DD,只要列的区域设置为英语区域设置,OLEDB就可以将MMM-yyy
解析为日期。您显示的只是文本,而不是日期。该文本字段的某些部分可能包含日期,也可能不包含日期。您必须解析每个值以提取任何看起来像日期的内容,因为这是标记为excel的,我将提供一个excel解决方案。在B6中添加:=Ri