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
时的含义。由于这不一定是显而易见的,并且可能会在读取数据模型中的多个位置使用,因此将其放入用户定义的标量函数中可能是值得的。
我想使用计算列计算 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
.
为此,我们需要在 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
时的含义。由于这不一定是显而易见的,并且可能会在读取数据模型中的多个位置使用,因此将其放入用户定义的标量函数中可能是值得的。