将decimal和date / datetime类型转换为自定义varchar等效项

时间:2010-10-28 13:08:42

标签: sql-server sql-server-2005 tsql ssis

我正在通过SSIS包生成一个平面文本文件。包从表中读取数据,创建固定长度的文本文件,并将文件ftp发送给合作伙伴。

数据通过我控制的流程进入我的表格,因此我可以根据建议进行调整。

我的庸医就是这样。

我有两个字段,让我们称呼它们: DateOfHire - 将作为日期时间或日期存储,尽管时间无关紧要 收益 - 这将始终具有6的标度,精度为2,即十进制(6,2)

现在我的问题是这个,因为这两个字段的最终目的地将是一个文本文件,我必须在写入之前更改它们的格式,我应该将它们存储为应该的内容存储为,即日期作为日期和十进制值作为小数或我应该只是使表存储varchars?

我问的原因是: 如果租用日期是10/07/10 - >文件中的记录将写为100710 如果收益为250.99美元 - >文件中的记录将写为025099

这是第一个问题。

第二个问题是如何将小数字像250.99转换为025099,因为9999.99是绝对可能的最大值。

SQL Server版本:2008

2 个答案:

答案 0 :(得分:2)

问题1:

  • 妥善存储(日期为日期时间等)。其他客户可能会使用此数据。并保持人类可读性。

  • 在客户端转换(无论是在GUI中渲染还是用于文件导出) 对于GUI,您可能需要区域设置。对于文件,我会考虑在SQL中执行它,但作为bcp / read的一部分。

问题2:

不要将其转换为数字,而是将其作为字符串进行操作,因为它的简单性。而且你避免了日期类型问题

有关值:

SELECT RIGHT('000000' + LTRIM(REPLACE(STR ('250.99', 7, 2), '.', '')), 6)

或根据您的开关示例

CASE
  WHEN Earnings = 250.99 THEN 
       --varchar, not decimal
       RIGHT('000000' + LTRIM(REPLACE(STR ('250.99', 7, 2), '.', '')), 6) 
  ELSE CONVERT(varchar(6), DateOfHire, 12) --varchar. not datetime
END AS Whatever

答案 1 :(得分:0)

首先,我不建议您将这些值存储在varchar字段中。

将值导出到文本文件时,可以使用查询来准备数据。

例如,

select convert(varchar(8), DateOfHire, 112) DateOfHireText,
,replicate('0', 6- len(convert(varchar(10), CEILING(earnings * 100)))) + convert(varchar(10), CEILING(earnings * 100)) EarningsText
from mytable

这将以您想要的格式返回数据。