SAP HANA Cloud 上的时差计算

Time Difference Calculation on SAP HANA Cloud

我想使用计算列计算 Occurence_TimeStamp 和 Response_TimeStamp 之间的差异。

我已经使用 SECONDS_BETWEEN("Occurence_TimeStamp", "Response_TimeStamp") 来转换秒数的差异。

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

例如 00:32:00 - 23:41 应该 return 3,060 秒,但 HANA returned -83340。我的解决方案是在每个受影响的时间差上增加 86,400 (60x60x24) 以解决问题。

这是我正在使用的代码 (TimeDrill = Response_Time - Occurence_Time)

案例“时光钻” 当“TimeDrill”> 0 时,则“TimeDrill” 否则“时间钻”+86400 结束

错误信息如下:

谢谢

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

在这种情况下,SECONDS_BETWEEN 函数需要先将时间值转换为 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()(绝对)函数来始终获得不带符号的值。

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

潜在的假设似乎是 RESPONSE_TS 总是 是一个时间戳 OCCURRENCE_TS 之后。这在因果模型中是有意义的。例如。发生某事,然后对那件事作出回应。

在这种情况下,一天中的某个时间 响应的时间戳似乎 必须解释为具有发生在第二天。在 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;
    

在此解决方案中,只要响应似乎比发生时间早,就会在 RESPONSE_TS 中添加一天以将其转移到第二天。

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

了解此方法根据 规则重新计算信息很重要 关于 RESPONSE_TS 小于 OCCURRENCE_TS 时的含义。由于这不一定是显而易见的,并且可能会在读取数据模型中的多个位置使用,因此将其放入用户定义的标量函数中可能是值得的。