【问题标题】:How do I extract the time-of-day from a date in Oracle SQL?如何从 Oracle SQL 中的日期中提取时间?
【发布时间】:2016-11-29 03:52:12
【问题描述】:

我有一个日期和时间的 SQL 数据库,但它们被组合成一个值(称为时间)。我想确定每小时的条目数,但我不知道如何做到这一点。 如果我这样做:

Select time from time_table

我得到的结果是:

2016-05-13 07:23:23
2016-05-13 07:34:34
2016-05-14 07:21:00
2016-05-14 09:42:43

我想要的是:

07:23:23
07:34:34
07:21:00
09:42:43

我可以排序得到:

07:21:00
07:23:23
07:34:34
09:42:43

或者,最终,我想获得计数:

07-08: 3
08-09: 0
09-10: 1

有什么办法吗?

【问题讨论】:

标签: sql oracle


【解决方案1】:

时间可以从 DATE 数据类型的值中提取,方法是减去该值的截断:

select time - trunc(time) from.....

这将返回一个小数,>= 0 和

例如,我现在是晚上 8:08 左右。那么:

select 24 * (sysdate - trunc(sysdate)) as result from dual;

    RESULT
----------
20.1566667

所以现在,如果我想知道小时,我可以再次使用trunc()。早些时候我截断了一个日期;现在结果是一个数字,我截断了一个数字。

把它们放在一起(第一部分生成从 0 到 23 的整数):

with h ( hr ) as (select level - 1 from dual connect by level <= 24)
select h.hr, count(tt.time) as ct
from   h left outer join time_table tt on h.hr = trunc(24 * (tt.time - trunc(tt.time)))
group by h.hr
order by hr  -- optional
;

你可以用不同的方式格式化“小时”列,虽然我不明白这一点;我的解决方案将在您显示 08-09 的位置显示 8。两者具有相同的信息。

【讨论】:

    【解决方案2】:

    这是一种具有两个子查询的解决方案,一个用于生成完整的小时列表,另一个用于生成目标表中的数字列表。外部连接对于在没有匹配的小时内产生零计数是必要的。

    请注意,诸如 7-8、8-9 之类的存储桶标签意味着重复计算,因此我忽略了这一点,而支持单小时。

    SQL> select * from t42
      2  /
    
            ID TCOL
    ---------- -------------------
             1 2016-05-13 07:23:23
             2 2016-05-13 07:34:34
             3 2016-05-14 07:21:00
             4 2016-05-14 09:42:43
    
    SQL> with hrs as (select level-1 as hr
      2               from dual
      3               connect by level <= 24 )
      4     , t as (select to_number(to_char(tcol, 'HH24')) as hr
      5             from t42)
      6  select hrs.hr
      7            , count(t.hr)
      8  from hrs
      9       left outer join t
     10        on hrs.hr = t.hr
     11  where hrs.hr between 7 and 9
     12  group by hrs.hr
     13  order by hrs.hr
     14  /
    
            HR COUNT(T.HR)
    ---------- -----------
             7           3
             8           0
             9           1
    
    SQL> 
    

    此解决方案假定时间列是 Oracle 日期数据类型。如果它是一个字符串,那么要么先将其转换为日期,要么应用substr()

    【讨论】:

      【解决方案3】:

      这将帮助您解决从 Counting number of records hour by hour between two dates in oracle

      SELECT 
             trunc(time ,'HH'), 
             count(*) 
           FROM 
             time_table
           WHERE 
             time > trunc(SYSDATE -2) 
           group by trunc(time ,'HH');
      

      结果

      2016-11-29 09:00:00.0 | 8 |

      【讨论】:

      • 这种方法将不同日期的时间 ​​09:15:00 视为属于不同的“一小时间隔”。 OP 特别想丢弃日期部分,并将上午 7 点到 8 点之间的所有内容(例如)一起计算,即使是不同的日期。
      • 所以为了计算早上 7 点到 8 点之间的所有内容,即使从不同的日期开始,只需删除 "WHERE 子句" 。例如,最终查询将是这样的 SELECT trunc(DTIME ,'HH'), count(*) FROM time_table group by trunc(DTIME ,'HH');
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      • 2010-12-27
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多