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