SSIS仅从Excel工作表加载日期

SSIS仅从Excel工作表加载日期,excel,ssis,conditional,Excel,Ssis,Conditional,我有一个包含多张工作表的Excel文件,但只有第一张工作表上列出了日期。我试图做的是读取excel文件,将其放入变量中,以便以后在数据流任务中使用 通常情况下,这将是您的常规读写数据流任务,但由于此信息位于excel工作表的第一页,其中包含了有关报告的大部分信息,因此读取信息会有点困难 这是这张表的样子,我想从整张表中得到的唯一信息是数据期行,更具体地说,2016年12月 如有任何指示,将不胜感激,谢谢 如果已使用SSI将“数据周期”列的单元格内容加载到SQL表中,则可以使用以下选项之一轻松将

我有一个包含多张工作表的Excel文件,但只有第一张工作表上列出了日期。我试图做的是读取excel文件,将其放入变量中,以便以后在数据流任务中使用

通常情况下,这将是您的常规读写数据流任务,但由于此信息位于excel工作表的第一页,其中包含了有关报告的大部分信息,因此读取信息会有点困难

这是这张表的样子,我想从整张表中得到的唯一信息是数据期行,更具体地说,
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任务
读取迭代结果的单元格区域,也可以像读取区域一样读取单个单元格,并将其值存储在变量中

该过程在中进行了描述,并包含了许多问题:

  • 添加指向Excel文件的Excel连接管理器
  • 将其结果类型设置为
    单行
  • 将查询设置为
    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任务
    读取迭代结果的单元格区域,也可以像读取区域一样读取单个单元格,并将其值存储在变量中

    该过程在中进行了描述,并包含了许多问题:

  • 添加指向Excel文件的Excel连接管理器
  • 将其结果类型设置为
    单行
  • 将查询设置为
    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