【问题标题】:Calculate time difference in Teradata计算 Teradata 中的时差
【发布时间】:2018-08-17 21:22:56
【问题描述】:

我有一个场景以分钟计算时间戳的差异。 2 个表中有一个公共字段,即 dw_job_id 并想加入2个表并猜测,计算

(scratch.COGIPF_RUNREPORT_test2.end_ts - concat(proct_dt, scratch.dw_job_sla_dim_test.sla_time)

例如,分钟减法:

(2018-03-05 01:53:14.201000 - 2018-03-05 08:00:00.000000)= -366

使用以下记录会很清楚:

第一个查询有 end_ts:

sel * from scratch.COGIPF_RUNREPORT_test2 where  dw_job_id=1226

结果:

dw_job_id   proct_dt              start_ts              end_ts                 time_diff    dw_job_status_id    
1,226       2018-03-05 00:00:00   2018-03-05 01:50:23   2018-03-05 01:53:14.201000  3            12                                                                    
1,226       2018-03-06 00:00:00   2018-03-06 01:42:56   2018-03-06 01:45:23.553000  3            12 

第二次查询:

select * from scratch.dw_job_sla_dim_test  where dw_job_id=1226

结果:

dw_job_id   sla_hour    sla_minute   sla_time
1,226       8             0           08:00:00.000000   

最终结果应该是:

 dw_job_id  run_date       start_timestamp               end_timestamp           runtime_minutes      sla_miss_minutes

  1,226     3/5/2018    3/5/2018 01:50:23.000000    3/5/2018 01:53:14.201000       2                     -366   
  1,226     3/6/2018    3/6/2018 01:42:56.000000    3/6/2018 01:45:23.553000       2                     -374

例子:

分钟减法:-(2018-03-05 01:53:14.201000 - 2018-03-05 08:00:00.000000)= -366

数据类型:

  sla_hour INTEGER,
  sla_minute INTEGER,
  sla_time TIME(6),
  end_ts VARCHAR(50) CHARACTER SET LATIN NOT CASESPECIFIC,

【问题讨论】:

  • cast(start_ts as time) 提取时间部分,现在加入 SLA 表,cast(start_ts as time) - sla_time minute(4) 返回差异
  • 尝试这个:- 从头开始​​选择演员(a.end_ts 作为时间)- sla_time 分钟(4)。COGIPF_RUNREPORT_test2 a 左外连接 scratch.dw_job_sla_dim_test b on b.dw_job_id=a.dw_job_id 其中 a。 dw_job_id=1226 ;但获得无效时间
  • @dnoeth 上面一个是错误的查询.. 因为它在 sla_time 之前没有 2018-03-05
  • 嗨,有没有关于这个..的提示?请看一次
  • 根据您的示例sla_time 是TIME,因此差异计算应该有效,确切的错误消息是什么? sla_time 不需要日期部分,因为 start_ts 和 sla_time 都来自同一日期。

标签: datetime timestamp left-join teradata teradata-sql-assistant


【解决方案1】:

我过去使用过以下逻辑。但我认为这是你所追求的。

,(CAST((CAST(end_timestamp AS DATE)- CAST(start_timestamp AS DATE)) AS DECIMAL(18,6)) * 60*24)
  + ((EXTRACT(  HOUR FROM end_timestamp) - EXTRACT(  HOUR FROM start_timestamp))* 60)
  + ((EXTRACT(MINUTE FROM end_timestamp) - EXTRACT(MINUTE FROM start_timestamp))  )
  + ((EXTRACT(SECOND FROM end_timestamp) - EXTRACT(SECOND FROM start_timestamp))/60)
AS "Difference in Minutes"

对于其他人,我也会包括我的小时和秒计算

,(CAST((CAST(end_timestamp AS DATE)- CAST(start_timestamp AS DATE)) AS DECIMAL(18,6)) * 60*60*24)
  + ((EXTRACT(  HOUR FROM end_timestamp) - EXTRACT(  HOUR FROM start_timestamp))* 60*60)
  + ((EXTRACT(MINUTE FROM end_timestamp) - EXTRACT(MINUTE FROM start_timestamp)) * 60)
  + ((EXTRACT(SECOND FROM end_timestamp) - EXTRACT(SECOND FROM start_timestamp)))
AS "Difference in Seconds"  


,(CAST((CAST(end_timestamp AS DATE)- CAST(start_timestamp AS DATE)) AS DECIMAL(18,6)) * 24)
  + ((EXTRACT(  HOUR FROM end_timestamp) - EXTRACT(  HOUR FROM start_timestamp)))
  + ((EXTRACT(MINUTE FROM end_timestamp) - EXTRACT(MINUTE FROM start_timestamp)) / 60.000000)
  + ((EXTRACT(SECOND FROM end_timestamp) - EXTRACT(SECOND FROM start_timestamp)) / 3600.000000)
AS "Difference In Hours"    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-18
    • 2014-04-26
    • 2016-09-15
    • 2013-09-05
    • 2014-11-16
    相关资源
    最近更新 更多