将teradata时间戳(6)转换为SQL Server的datetime

时间:2017-09-01 09:15:40

标签: sql sql-server ssis teradata

我正在从SSIS处理数据导出,我的一个项目中有一个截断错误:

  

[TH27 [91]]错误:"发生截断错误。列名是' 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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

如果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日期时间

答案 2 :(得分:0)

我找到了这个解决方案,我在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

答案 3 :(得分:0)

不要在日期(时间)使用强制转换,请使用转换。这仅适用于您的计算机;)只要您必须处理多个文化设置,这可能会失败,因为日期格式的字符串表示形式不同。

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

答案 4 :(得分:0)

借助SSIS将数据从teradata加载到sql。 对我来说这是工作,将Timestamp(6)转换为SQL Server的日期时间

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