我正在从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架构的一个例子
答案 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')