sql - 选择按时间分组的午夜数据

标签 sql oracle group-by

我有一张像:

ID       TIMEVALUE
-----    -------------
1        06.07.15 06:43:01,000000000
2        06.07.15 12:17:01,000000000
3        06.07.15 18:21:01,000000000
4        06.07.15 23:56:01,000000000
5        07.07.15 04:11:01,000000000
6        07.07.15 10:47:01,000000000
7        07.07.15 12:32:01,000000000
8        07.07.15 14:47:01,000000000

我想按特殊时间对这些数据进行分组。
我当前的查询如下所示:
SELECT TO_CHAR(TIMEVALUE, 'YYYY\MM\DD'), COUNT(ID), 
  SUM(CASE WHEN TO_CHAR(TIMEVALUE, 'HH24MI') <=700 THEN 1 ELSE 0 END) as morning,
  SUM(CASE WHEN TO_CHAR(TIMEVALUE, 'HH24MI') >700 AND TO_CHAR(TIMEVALUE, 'HH24MI') <1400 THEN 1 ELSE 0 END) as daytime,
  SUM(CASE WHEN TO_CHAR(TIMEVALUE, 'HH24MI') >=1400 THEN 1 ELSE 0 END) as evening FROM Table
WHERE TIMEVALUE >= to_timestamp('05.07.2015','DD.MM.YYYY')
GROUP BY TO_CHAR(TIMEVALUE, 'YYYY\MM\DD')

我得到这个输出
day          overall     morning    daytime    evening 
-----        ---------
2015\07\05   454         0          0          454
2015\07\06   599         113        250        236
2015\07\07   404         139        265        0

这样就可以在同一天分组(0-7 点钟、7-14 点钟和 14-24 点钟)
但我现在的问题是:
我怎样才能在午夜分组?

例如从第二天的 6-14 点、14-23 点和 23-6 点开始计数。

我希望你明白我的问题。如果有更好的解决方案,欢迎您甚至改进我的上层查询。

最佳答案

编辑 : 现已测试:SQL Fiddle

关键只是调整group by这样早上 6 点之前的任何内容都会与前一天分组。在那之后,计数非常简单。

SELECT TO_CHAR(CASE WHEN EXTRACT(HOUR FROM timevalue) < 6
                    THEN timevalue - 1
                    ELSE timevalue
                    END, 'YYYY\MM\DD') AS day, 
       COUNT(*) AS overall, 
       SUM(CASE WHEN EXTRACT(HOUR FROM timevalue) >= 6 AND EXTRACT(HOUR FROM timevalue) < 14
                THEN 1 ELSE 0 END) AS morning,
       SUM(CASE WHEN EXTRACT(HOUR FROM timevalue) >= 14 AND EXTRACT(HOUR FROM timevalue) < 23
                THEN 1 ELSE 0 END) AS daytime,
       SUM(CASE WHEN EXTRACT(HOUR FROM timevalue) < 6 OR EXTRACT(HOUR FROM timevalue) >= 23
                THEN 1 ELSE 0 END) AS evening
FROM my_table
WHERE timevalue >= TO_TIMESTAMP('05.07.2015','DD.MM.YYYY')
GROUP BY TO_CHAR(CASE WHEN EXTRACT(HOUR FROM timevalue) < 6
                    THEN timevalue - 1
                    ELSE timevalue
                    END, 'YYYY\MM\DD');

关于sql - 选择按时间分组的午夜数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31269273/

相关文章:

c# - 向sql数据库添加数据?使用odbc

SQL/甲骨文 - "Cannot insert null into primary key"

oracle - 使用 Oracle DB 配置 Tomcat 的 JDBCRealm - 什么是正确的表结构?

mysql - 请帮助优化 MYSQL 表和/或查询

tsql - 内连接计数和分组依据

sql - TSQL: "IN"子句中的 NULL

mysql - 在 mysql Alter Table 中不存在默认值的情况下将默认值设置为 0

java - Eclipse 找不到 Oracle VM 模拟器

mysql - 按城市分组年龄

sql - H2。将字符串插入 VARBINARY(255)