我正在尝试使用SSIS自动化一个进程,该进程将数据导出到一个平面文件(.csv)中,然后保存到目录中,然后由某些会计软件对其进行扫描和导入。该软件(不幸的是)仅识别MM / DD / YYYY方式的日期。我已经尝试了将从SQL提取的数据转换或转换为MM / DD / YYYY的每种方式,但不知何故,数据总是在平面文件连接中被识别为DT_Date或DT_dbDate数据类型,并保存为YYYY-MM-DD。
我尝试了各种数据转换,派生列以及将平面文件列的属性更改为字符串的组合,希望我至少可以使用子字符串操作来正确地格式化,但它永远不会保存下来作为YYYY-MM-DD。这真是令人费解。 OLE DB源代码中的预览会将日期显示为“MM / DD / YYYY”,但不知何故,当它到达平面文件时,它总是会更改为“YYYY-MM-DD”。
我试图查找解决方案(例如,这里:Stubborn column data type in SSIS flat flat file connection manager won't change. :(),但没有运气。令人惊讶的是,如果我只是在Excel中打开并保存它,那么它将在文本编辑器中将日期显示为“MM / DD / YYYY”,只会为这个百慕大三角形的雀跃增添更多神秘感。
如果有任何提示,我会非常感激。
答案 0 :(得分:0)
这是日期格式问题。
在SQL和SSIS中,日期有一个literal string format,即YYYY-MM-DD。忽略它们在数据预览器和/或Excel中的显示方式。根据您的Windows regional prefrences向您显示日期。
上图 - 与美国不同 - 英国人将所有日期视为DD / MM / YYYY。我们显示日期的方式不是它们存储在磁盘上的方式。当您在Excel中打开时,它会将此转换作为帮助。直到您根据您的区域偏好保存日期(作为文本)。
为了让日期始终以相同的方式显示。我们需要将它们保存为日期,而不是文本字符串。为此,我们必须将数据从日期列DT_DATE
或DT_DBDATE
中提取到字符串列中:DT_STR
或DT_WSTR
。然后,将此新字符串列映射到csv文件中。有两种方法可以实现“日期到字符串”的转换......
首先,让SQL做到这一点。更新OLE DB源查询并再添加一列...
SELECT
*,
CONVERT(VARCHAR(10), MyDateColumn, 101) AS MyFormattedDateColumn
FROM MyTable
另一种方式是让SSIS这样做。添加带有表达式
的派生列组件 SUBSTRING([MyDateColumn],6,2) + "/" + SUBSTRING([MyDateColumn],8,2) + "/" + SUBSTRING([MyDateColumn],1,4)
将字符串列映射到csv文件,而不是日期列。希望这会有所帮助。