【问题标题】:teradata: convert smallint to timeteradata:将 smallint 转换为时间
【发布时间】:2017-08-11 15:08:49
【问题描述】:

好的,我看到了这个post 并尝试了建议的方法,但这似乎对我不起作用。感谢帮助!谢谢!

以下是各个列的数据类型:

列名:col_dt [DATE]col_tm [SMALLINT]

数据样本:

col_dt: 2017-08-10 col_tm: 1,630

这是我的代码 sn-p。我正在尝试使用以下代码将两列合并为一列:

(trim(col_dt) || ' ' || right('0' + convert(varchar(10), col_tm/100),2) + ':' + right('0' + convert(varchar(10),col_tm%100),2)) as col_dtmstp,

【问题讨论】:

  • 语法错误:预期“||”之间的内容和“正确”关键字

标签: sql teradata


【解决方案1】:

您可以将col_dt 转换为时间戳,这会导致午夜,然后将col_tm 双重转换为一个字符串,然后再转换为interval

Cast(col_dt AS TIMESTAMP(0)) 
+ Cast(Trim(col_tm (Format '99:99')) AS INTERVAL HOUR TO MINUTE) 

【讨论】:

  • 谢谢@dnoeth。您提供的解决方案有效。但是,我在问题(我很抱歉)中错误地提到 col_date 格式具有“YYYY-MM-DD”;相反,它位于“dd/mm/yyyy”中。我所有的其他列都是 'YYYY-MM-DD' 格式,我希望 col_date 以同样的方式显示。
  • @k.learn: 当col_dtdate 时,不需要做任何事情,因为时间戳的默认格式已经是`yyyy-mm-dd hh:mi:ss'
【解决方案2】:

在您提到的帖子中,他们使用了right 函数,该函数不是 teradata sql 中的内置函数。你可以改用CAST 函数。

下面的查询将生成数据类型为TIMESTAMP 的所需结果。

SELECT Cast(Trim('2017-08-10' 
          || ' ' 
          ||Trim(Cast(1630 / 100 AS CHAR(10))) 
          || ':' 
          || Trim(Cast(1630 MOD 100 AS CHAR(10))) 
          || ':00') AS TIMESTAMP(0) Format 'yyyy-mm-ddBhh:mi:ss');

已通过 Teradata SQL Assistant 和 bteq 成功测试。您可以使用type[expression] 函数确认其数据类型。

【讨论】:

    猜你喜欢
    • 2016-11-21
    • 2022-07-20
    • 2017-03-29
    • 2017-07-02
    • 2016-09-08
    • 2018-12-03
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    相关资源
    最近更新 更多