【发布时间】:2023-03-04 08:28:01
【问题描述】:
我有以下问题:
我有一个开始字段(类型:时间戳)和一个结束字段(类型:时间戳)。现在我想把这个间隔分配给一个小时方向的间隔 [0-1],[1-0]…..
示例:
开始时间:14:20
结束:16:45
结果应该是这样的:
[0-1],[1-2]…..[13-14],[14-15],[15-16],[16-17],[17-18]….
0 0 0 1 1 1 0
到目前为止我做了什么:
到目前为止,我所做的是将这个开始-结束间隔映射到一个位掩码中。这是一种可能的短而有效的方式。因此,上面示例的这个位掩码看起来像(最低有效位对应于 [0-1] 的范围):
( 000000011100000000000000 )2 ≙ 114688
然后我做一个 Bitand 来决定这是否对应于一个范围:
CASE
WHEN Bitand(mask, Power(2, 0)) > 0 THEN 1
ELSE 0
END AS g0001, --[0-1]
CASE
WHEN Bitand(mask, Power(2, 1)) > 0 THEN 1
ELSE 0
END AS g0102, --[1-2]
…
CASE
WHEN Bitand(mask, Power(2, 23)) > 0 THEN 1
ELSE 0
END AS g2324 --[23-24]
但是这个解决方案很长,很不方便,并且在 bitand 部分重复了很多类似的行。知道有人更短/更好的解决方案吗?
PS:不允许存储过程!
【问题讨论】:
标签: sql date oracle11g mapping