Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何将XML文件中的Excel序列号转换为SSIS包中SQL Server的mm/dd/yyyy?_Sql Server_Excel_Xml_Date_Ssis - Fatal编程技术网

Sql server 如何将XML文件中的Excel序列号转换为SSIS包中SQL Server的mm/dd/yyyy?

Sql server 如何将XML文件中的Excel序列号转换为SSIS包中SQL Server的mm/dd/yyyy?,sql-server,excel,xml,date,ssis,Sql Server,Excel,Xml,Date,Ssis,我收到一个XML文件,其中日期字段是Excel序列日期编号,而不是通常的mm/dd/yyyy日期。将数据转换添加到先前存在的SSIS包时遇到问题,因为序列号位于XML文件中,而不是excel文件中 SSIS包将清理一个xml文件并将其加载到SQL Server表中 有人有什么想法吗?我在2015年视觉工作室工作,仅供参考 XML数据片段: <AGREEMENT_CODE>1960-EMPR</AGREEMENT_CODE> <AGREEMEN

我收到一个XML文件,其中日期字段是Excel序列日期编号,而不是通常的mm/dd/yyyy日期。将数据转换添加到先前存在的SSIS包时遇到问题,因为序列号位于XML文件中,而不是excel文件中

SSIS包将清理一个xml文件并将其加载到SQL Server表中

有人有什么想法吗?我在2015年视觉工作室工作,仅供参考

XML数据片段:

    <AGREEMENT_CODE>1960-EMPR</AGREEMENT_CODE>
        <AGREEMENT_NAME>1960-Legacy Employer Conversion 
    Default</AGREEMENT_NAME>
        <AGREEMENT_TYPE>MBA</AGREEMENT_TYPE>
        <FUND_TYPE>Health &amp; Pension</FUND_TYPE>
        <CONTRACT_START_DATE>21916</CONTRACT_START_DATE>
        <EMPLOYER_ID>25568</EMPLOYER_ID>
        <EMPLOYER_NAME>10409</EMPLOYER_NAME>
        <BILLING_ENTITY_CODE>ACT III TELEVISION, L.P.</BILLING_ENTITY_CODE>
        <BILLING_ENTITY_NAME>10409</BILLING_ENTITY_NAME>
        <PARTICIPATION_START_DATE>ACT III TELEVISION, L.P. 
   </PARTICIPATION_START_DATE>
        <PARTICIPATION_SIGNED_DATE>35917</PARTICIPATION_SIGNED_DATE>
1960-EMPR
1960年遗留雇主转换
违约
工商管理硕士
徖生署;退休金
21916
25568
10409
第三幕电视,L.P。
10409
第三幕电视,L.P。
35917

Excel序列日期编号位于第6行和第13行。它们是5位数字。

Excel中的日期实际上是一个数字,表示自1899年12月30日以来的天数。然而,下面有一个警告

因此,您可以使用
DATEADD(day,@yourDateNum,'18991230')

需要注意的是,Microsoft(以及之前的Lotus 1-2-3)在日期计算中有一个错误:,而事实并非如此。因此,计数中还有一天,我调整了上面的公式以考虑到这一点。然而,结果是,这个公式不适用于1900年3月1日之前的日期


在投入生产之前,请用已知值检查您的公式

我使用了十多年的代码现在来自一个不存在的网站

    /// <summary>
    /// Seriously?  For the loss
    /// <see cref="http://www.debugging.com/bug/19252"></see>
    /// </summary>
    /// <param name="excelDate">Number of days since 1900-01-01</param>
    /// <returns>The converted days to date</returns>
    public static DateTime ConvertXlsdtToDateTime(int excelDate)
    {
        DateTime dt = new DateTime(1899, 12, 31);

        // adjust for 29 Feb 1900 which Excel considers a valid date
        if (excelDate >= 60)
        {
            excelDate--;
        }

        return dt.AddDays(excelDate);
    }
通常,我的数据流中会有两个派生列组件,因为这是调试东西的唯一方法。在您的情况下,我会让第一个派生列向数据流添加1+个Excel列

注意,我在这里显示的赋值
=
是您在派生任务中放入
派生列名
表达式
列的值的简写语法

BaseDate = (DT_DATE)"1899-12-30"
CONTRACT_START_DATE_Offset = [CONTRACT_START_DATE] >= 60 ? -1 : 0
PARTICIPATION_SIGNED_DATE_Offset = [PARTICIPATION_SIGNED_DATE] >= 60 ? -1 : 0
等。现在我可以检查我是否正确处理1900错误的偏移值

这就把我的第一个表达式简化为

DATEADD("Day", [CONTRACT_START_DATE] - [CONTRACT_START_DATE_Offset], [BaseDate])
如果你真的想找出哪里出了问题,我甚至会考虑将那里的数学逻辑
Col1-Col1\u Offset
封装到一个preducer派生的列中,这样我就可以在上面放置一个数据点击/数据查看器并捕获值

作为一个最小的复制,我创建了一个包含OLESRC组件的包,该组件将合同开始日期添加到数据流中

SELECT 35 AS CONTRACT_START_DATE
UNION ALL SELECT 21916
我使用第一个表达式的派生列“OneShot”添加了列“OneShot”

DER Multistatement从第二组表达式中添加BaseDate和CONTRACT_START_DATE_Offset值

DER CSD使用第三个表达式将ContractStartDate添加到数据流中

在上图中,您可以看到data viewer的结果(以及此时元数据的副本)。在使用DATEADD函数-DT_DBTIMESTAMP之后,我的数据类型与预期的一样


如果您的类型显示为DT_WSTR,请确保您正在添加一个新列,而不是试图替换现有列。

感谢您的回复。我现在遇到的问题是,我无法从DT_WSTR(255)更改派生列数据类型,并且它表示DATEADD函数不支持该数据类型。我可以在脚本中单独派生一列吗?在派生列中添加一个新列(不要尝试替换现有列)分隔这些步骤非常有效,感谢您的帮助@BillinkCt感谢您的回复。我现在遇到的问题是,我无法从DT_WSTR(255)更改派生列数据类型,并且它表示DATEADD函数不支持该数据类型。我可以单独在脚本中派生列吗?
SELECT 35 AS CONTRACT_START_DATE
UNION ALL SELECT 21916