转换Teradata的时间戳(6),以日期时间为SQL Server

问题描述:

我正在从SSIS数据出口,我在我的项目之一有一个截断误差:转换Teradata的时间戳(6),以日期时间为SQL Server

[TH27 [91]] Error: "A truncation error occurred. Column name is 'mydate'."

在输入(Teradata数据) ,我有一个类型为timestamp(6)的列,并且在SQL Server的输出中,我有一个类型为datetime的列。

我该如何将它转换成当我使用SSIS的方式,我不会得到这种错误?

我尝试(请求1):

SELECT 
    column1, 
    CAST(CAST(CAST(mydate AS DATE FORMAT 'YYYY-MM-DD') AS CHAR(10)) || ' ' 
      || TRIM(EXTRACT(HOUR FROM (mydate))) || ':' 
      || TRIM(EXTRACT(MINUTE FROM (mydate))) || ':' 
      || TRIM(CAST(EXTRACT(SECOND FROM (mydate)) AS INTEGER)) AS Date) AS mydate, 
    column2 
FROM table1 

更新:

,我写的是在Teradata源这里是我的SSIS模式的一个例子请求

My SSIS Schema

这可能是因为SQL Server不支持6个小数位数,所以它与Teradata的3位小数转换为字符串:

To_Char(myDate,'yyyy-mm-dd hh:mi:ss.ff3') 

如果mydate是时间戳,只是施放它:

select column1, 
     cast(mydate as datetime) as column2 
from MyTable 

好,在这样的Teradata执行意味着你不必日期时间...但是你确实有日期和时间:

select column1, 
     cast(mydate as date) as column2date, 
     cast(mydate as time) as column2time 
from MyTable 

然后,您可以使用SSIS操纵数据结合日期和时间为MSSQL日期时间

+0

我得到这个错误SELECT失败。 3706:语法错误:数据类型“datetime”与定义的类型名称不匹配。 我在teradata执行了这个请求 – Esperadoce

+0

@Esperadoce我看到了,我已经看到了SSIS模式......现在还不确定... – JohnHC

+1

@Esperadoce请参阅编辑 – JohnHC

我发现这个解决方案,在SSIS对我来说,工作是清除我们在timestamp(6)它之后转换成timestamp(0)的最后一部分。

select column1, 
     CAST(SUBSTRING(CAST(mydate AS CHAR(26)) FROM 1 FOR 19) AS TIMESTAMP(0)) 
     as mydate 
from MyTable 

不要日期,请用CAST(时间) ,使用convert。这只适用于你的机器;)当你必须处理多种文化设置时,这可能会失败,因为日期格式的字符串表示形式不同。

在美国以外,您很快就会遇到这样的错误。许多开发系统都使用美国设置,以便浏览错误消息,但客户系统在本地语言设置下运行,最糟糕的情况是在OS和DB的不同语言设置下运行。处理这个问题的最好方法是在内部使用ISO格式(120)。