【问题标题】:Oracle SQL -- TO_CHAR and TO_DATE StatementOracle SQL -- TO_CHAR 和 TO_DATE 语句
【发布时间】:2018-06-17 17:45:19
【问题描述】:

我在 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。最终目标是对给定时间的 TIME 上的所有输出求和。输出将返回 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 小时的小时计数结果?

谢谢

【问题讨论】:

  • 除了 Gordon 指出的过滤器问题之外,提取小时将为您提供 0-23,而不是 1-24。 (你的elseexpected to catch - null 值是什么?)
  • 谢谢!是的,我希望捕捉到 NULL 值,这很可能不会是任何值。
  • Null 值会被过滤器排除在外吗?而且您的第二个版本仍然排除 00:00:00 和 01:00:00 之间的值,如果您期望所有时间都有结果,这可能不是您想要的。

标签: sql oracle to-date to-char


【解决方案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 条件,您可能会获得额外的时间。

【讨论】:

  • 谢谢戈登。我能够修复它并且它确实填充了。我修复了第二个查询但不是第一个查询时出错。
【解决方案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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    相关资源
    最近更新 更多