Time SAP HANA云上的时差计算

Time SAP HANA云上的时差计算,time,calculated-columns,hana,Time,Calculated Columns,Hana,我想使用计算列计算发生时间戳和响应时间戳之间的差异 我使用了秒之间的时间(“发生时间戳”、“响应时间戳”)来转换秒之间的差异 我现在面临的挑战是,对于第二天发生的响应时间,SAP HANA返回负值 例如00:32:00-23:41应该返回3060秒,但HANA返回-83340秒。我的解决方案是在每个受影响的时差中添加86400(60x60x24),以解决问题 下面是我正在使用的代码(TimeDrill=Response\u Time-occurrence\u Time) 案例“时间钻” 当“Ti

我想使用计算列计算发生时间戳和响应时间戳之间的差异

我使用了秒之间的时间(“发生时间戳”、“响应时间戳”)来转换秒之间的差异

我现在面临的挑战是,对于第二天发生的响应时间,SAP HANA返回负值

例如00:32:00-23:41应该返回3060秒,但HANA返回-83340秒。我的解决方案是在每个受影响的时差中添加86400(60x60x24),以解决问题

下面是我正在使用的代码(TimeDrill=Response\u Time-occurrence\u Time)

案例“时间钻” 当“TimeDrill”>0时,则为“TimeDrill” 其他“时间钻”+86400 结束

错误消息如下:


谢谢

看起来您场景中的时间戳实际上是一天中的时间戳(例如,不是2020/12/01 08:48:12,只是08:48:12)

在这种情况下,函数需要首先将时间值转换为HANA时间戳(日期+时间)

如果未提供日期,则生成0001-01-01作为日期组件

在代码中查看这一点可以得出以下结论:

SELECT 
      to_timestamp ('00:32:00', 'HH24:MI:SS') "early_TS"
    , TO_TIMESTAMP ('23:41:00', 'HH24:MI:SS') "late_TS"
    , seconds_between ( to_timestamp ('00:32:00', 'HH24:MI:SS'),  TO_TIMESTAMP ('23:41:00', 'HH24:MI:SS')) "early_first"
    , seconds_between ( TO_TIMESTAMP ('23:41:00', 'HH24:MI:SS'),  to_timestamp ('00:32:00', 'HH24:MI:SS')) "late_first"
    
 FROM 
    DUMMY 

early_TS           |late_TS            |early_first|late_first|
-------------------|-------------------|-----------|----------|
0001-01-01 00:32:00|0001-01-01 23:41:00|      83340|    -83340|
这里需要注意的重要一点是,这两个时间戳之间的差异具有相同的绝对秒数。该符号仅表示差异的“方向”,例如,两个时间戳中哪一个大于另一个

对于您的计算,您可以使用
ABS()
(绝对)函数始终获取不带符号的值

----根据评论更新并重新阅读原始问题

基本假设似乎是
响应总是
发生后的时间戳。这在因果模型中是有意义的。例如,某件事发生了,然后对该事件有了反应

在这种情况下,似乎早于发生的响应的时间戳必须被解释为发生在第二天。在OP的示例中,
00:32:00
的响应应该在
23:41:00
发生后3060秒发生

为此,我们需要在SQL语句中区分大小写,因为实际时间数据不包含此信息

WITH event_ts AS 
    (SELECT   
          TO_TIMESTAMP ('23:41:00', 'HH24:MI:SS') "OCCURRENCE_TS"
        , to_timestamp ('00:32:00', 'HH24:MI:SS') "RESPONSE_TS" 
    FROM 
        DUMMY)
SELECT 
      "OCCURRENCE_TS" -- this is considered to ALWAYS happen BEFORE the RESPONSE
    , "RESPONSE_TS"   -- this is considered to ALWAYS happen AFTER the OCCURRENCE
   , CASE 
        WHEN ("RESPONSE_TS" > "OCCURRENCE_TS") THEN  -- "RESPONSE_AFTER_BUT_SAME_DAY"
            seconds_between ("OCCURRENCE_TS", "RESPONSE_TS")
        ELSE -- "RESPONSE_AFTER_BUT_NEXT_DAY"
            seconds_between ("OCCURRENCE_TS", ADD_DAYS("RESPONSE_TS", 1))
     END "SECONDS_BETWEEN_OCCURRENCE_AND_RESPONSE"
FROM 
    event_ts;
    
在该解决方案中,只要响应似乎比发生时间更早,则将一天添加到
响应
,以将其移到第二天

OCCURRENCE_TS      |RESPONSE_TS        |SECONDS_BETWEEN_OCCURRENCE_AND_RESPONSE|
-------------------|-------------------|---------------------------------------|
0001-01-01 23:41:00|0001-01-01 00:32:00|                                   3060|

重要的是要理解,这种方法基于规则重新计算信息,即当
响应小于
发生时它意味着什么。由于这不一定是显而易见的,并且可能会在整个读取数据模型的多个位置使用,因此将其放入用户定义的标量函数中可能是值得的。

感谢Lars的解释。正确答案应返回3060秒,而不是+/-83340秒。”00'和24'应该是同一个意思,也就是说,您希望两个时间戳中的一个在第二天。会是哪一个?始终是第一个操作数还是始终是第二个操作数?