Oracle SQL - TO_CHAR和TO_DATE语句

时间:2018-01-08 17:50:11

标签: sql oracle to-date to-char

我正在使用Oracle数据库,我正在尝试将其从12小时转换为24小时。

我目前已将HH更新为HH24并且我仍然看到了整整24小时的时间,事实上它只是拉动了当天的前12个小时。以下是我的工作查询,没有错误,输出正确的结果,而另一个缺少12小时。

SELECT
CASE(EXTRACT(HOUR FROM a.TIME)) 
WHEN 1 THEN '1'
WHEN 2 THEN '2'
WHEN 3 THEN '3'
WHEN 4 THEN '4'
WHEN 5 THEN '5'
WHEN 6 THEN '6'
WHEN 7 THEN '7'
WHEN 8 THEN '8'
WHEN 9 THEN '9'
WHEN 10 THEN '10'
WHEN 11 THEN '11'
WHEN 12 THEN '12'
WHEN 13 THEN '13'
WHEN 14 THEN '14'
WHEN 15 THEN '15'
WHEN 16 THEN '16'
WHEN 17 THEN '17'
WHEN 18 THEN '18'
WHEN 19 THEN '19'
WHEN 20 THEN '20'
WHEN 21 THEN '21'
WHEN 22 THEN '22'
WHEN 23 THEN '23'
WHEN 24 THEN '24'
ELSE 'OTHERS' END AS "ENTRY_TIME_HOUR",
COUNT(*) AS "TOTAL_WITHIN_THE_HOUR"

 FROM Table1 a 
 WHERE 
 a.TIME >= TO_DATE('2018/01/05 01:00:01', 'YYYY/MM/DD HH24:MI:SS') 
 AND a.TIME <= TO_DATE('2018/01/05 12:59:59', 'YYYY/MM/DD HH24:MI:SS')
 GROUP BY EXTRACT(HOUR FROM a.TIME)

上面的查询会输出类似下面的内容,但最多只能输出12(应该是1-24)

ENTRY_TIME_HOUR  TOTAL_WITHIN_THE_HOUR
   11                    68
   8                      3
   9                     83
  10                     26
  12                     62

此外,我发现TO_CHAR很有用但我无法一起运行TO_CHAR和TO_DATE。最终目标是在给定小时内按时间结束所有输出。输出将返回24行,每小时总计数。

以下是输出全部时间(不仅仅是小时HH)的单独查询:

SELECT
to_char(a.TIME, 'DD/MM/YYYY HH24:MI:SS') AS "TIME in 24"
FROM TABLE a 
WHERE 
AND a.TIME >= TO_DATE('2018/01/05 01:00:01', 'YYYY/MM/DD HH24:MI:SS') 
AND a.TIME <= TO_DATE('2018/01/05 23:59:59', 'YYYY/MM/DD HH24:MI:SS')

以上查询将提供如下内容:

 05/01/2018 15:00:40
 05/01/2018 16:01:45
 05/01/2018 09:59:51
 05/01/2018 10:04:58

但是,我无法将TO_CHAR和TO_DATE查询合并在一起而不会遇到多个问题。是否可以将第二个查询与第一个查询合并,将小时的计数结果提供给当天的整个24小时?

由于

2 个答案:

答案 0 :(得分:2)

首先,一天中的小时数从0到23,而不是1到24。

其次,你使简单的事情复杂化。

有什么问题
select to_char(a.time, 'HH24') theHour
, count(*) occurrences

from yourTable a

where a.time >= date '2018-01-05'
and a.time < date '2018-01-06'
group by to_char(a.time, 'HH24')

答案 1 :(得分:1)

评论太长了。首先,学习使用DATETIMESTAMP关键字。输入明确的时间戳更简单:

WHERE a.TIME >= TIMESTAMP '2018-01-05 01:00:01' AND
      a.TIME <= TIMESTAMP '2018-01-05 12:59:59'

这样写的,你只选择1到12之间的小时就更清楚了,这就是为什么你只得到那些时间。更改WHERE条件,您可能会有更多时间。