【问题标题】:Map dates into intervals with oracle sql使用 oracle sql 将日期映射到间隔
【发布时间】: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


    【解决方案1】:

    为什么不直接使用比较?

    (case when extract(hour from start) <= 0 and extract(hour from end) >= 0 then 1 else 0 end) as hour_01,
    (case when extract(hour from start) <= 1 and extract(hour from end) >= 1 then 1 else 0 end) as hour_02,
    . . .
    

    这差不多是相同数量的代码,但它更清楚你在做什么。

    【讨论】:

    • 是的,这肯定更清楚。但是如果有一个更短的替代方案(我忘了提到,这是一个子选择。选择构建每行的总和(24 行代码!))将非常有用。无论如何,这个建议提高了我的代码质量。 => 谢谢;-)
    猜你喜欢
    • 2012-04-09
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2018-01-20
    • 2014-06-08
    • 1970-01-01
    • 2019-08-30
    • 2012-03-19
    相关资源
    最近更新 更多