Oracle SQL - 将(日期和儒略时)转换为Julian小时

时间:2016-08-26 22:32:31

标签: sql oracle

Table view

日期是格里高利日期,小时是朱利安。如何获得两次之间的小时数差异?

1 个答案:

答案 0 :(得分:1)

假设您的日期列属于date数据类型,而时间列属于字符串类型(varchar2),您可以执行以下计算:

select to_char(trunc(hours) * 100 + (hours-trunc(hours))*60, 'fm0000') as hours_minutes
from (
        select (   (dtrecv - dtcoll)
                 + ( to_date(nvl(tmrecv, '0000'), 'hh24mi')
                   - to_date(nvl(tmcoll, '0000'), 'hh24mi')) 
               ) * 24 as hours
        from   sample_demog_view
);

如果时间列值为null,则假定为0000。当其中一个日期列为null时,结果也会为null

解释

摘要:内部SQL计算两个日期/时间之间的小时数作为小数。外部查询将此数字转换为4位24时钟表示法。注意:您可能需要或可能不需要第二步。

(dtrecv - dtcoll):从彼此中减去两个无时间日期,这给出了表示天数的数值。

to_date(nvl(tmrecv, '0000'), 'hh24mi'):将24时制表示法转换为日期/时间,但日期部分为零。对tmcoll执行相同的转换,并从第一个转换中减去。这给出了一个表示天数的数值,但它是介于-1和1之间的小数。

这会增加我们已经获得的天数差异,给出一个小数字,仍然表示天数。

将其转换为小时数:* 24

外部查询然后获取该值并截断它以获得整数小时数:trunc(hours)

然后取小数部分:hours-trunc(hours)。这将乘以60以获得相应的分钟数。

最后,添加小时和分钟(小时乘以100以便为分钟腾出空间)并格式化为4位数字符串。请注意,差异可能需要超过4位数,因此如果是这种情况,可能需要修改to_char格式。

外部查询的原因是我想避免重复相同的计算,所以我可以用hours来引用它。如果有一个更好的解决方案只引用hours一次,则不再需要这个select嵌套。