Time SAP HANA云上的时差计算
我想使用计算列计算发生时间戳和响应时间戳之间的差异 我使用了秒之间的时间(“发生时间戳”、“响应时间戳”)来转换秒之间的差异 我现在面临的挑战是,对于第二天发生的响应时间,SAP HANA返回负值 例如00:32:00-23:41应该返回3060秒,但HANA返回-83340秒。我的解决方案是在每个受影响的时差中添加86400(60x60x24),以解决问题 下面是我正在使用的代码(TimeDrill=Response\u Time-occurrence\u Time) 案例“时间钻” 当“TimeDrill”>0时,则为“TimeDrill” 其他“时间钻”+86400 结束 错误消息如下: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
谢谢看起来您场景中的时间戳实际上是一天中的时间戳(例如,不是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'应该是同一个意思,也就是说,您希望两个时间戳中的一个在第二天。会是哪一个?始终是第一个操作数还是始终是第二个操作数?