我有如下表
Prefix scandate
A 1/2/2013 08:30
A 1/2/2013 08:45
B 1/2/2103 09:15
我需要每小时输出计数,即
Time A B
08:30-09:30 2 0
09:30-10-30 0 1
直到晚上 7 点
有人能帮我吗
根据您使用的数据库,这样的事情应该有效:
SELECT
SUM(CASE WHEN DATEPART(hh, DATEADD(m, 30, scandate) = 1 THEN 1 ELSE 0 END) As '00:30 - 01:30 Block'
SUM(CASE WHEN DATEPART(hh, DATEADD(m, 30, scandate) = 2 THEN 1 ELSE 0 END) As '01:30 - 02:30 Block'
SUM(CASE WHEN DATEPART(hh, DATEADD(m, 30, scandate) = 3 THEN 1 ELSE 0 END) As '02:30 - 03:30 Block'
...
FROM table
您只需要迭代出小时部分标识符,直到晚上 7 点,即 1、2、...19。警告,这在上午 12:30 之前的任何时候都不起作用。
在 MySQL 中,您可以这样做:
SELECT
CONCAT(
HOUR(SUBTIME(scandate, '00:30:00')), ':30',
'-',
HOUR(ADDTIME(scandate, '00:30:00')), ':30') AS time,
SUM(IF(prefix = 'A', 1, 0)) AS A,
SUM(IF(prefix = 'B', 1, 0)) AS B
FROM tableName
WHERE TIME(scandate) <= '19:00:00'
GROUP BY HOUR(SUBTIME(scandate, '00:30:00'));
笔记:
查询必须有这些子和添加时间,因此间隔08:30-09:30
将更改为08:00-09:00
并且将有一个共同的小时(除了正好 09:00,它的小时是 09,而不是 08)。
我只尝试了 datetime 函数来达到time
输出中列的预期值,但我只能使用CONCAT
.
如果该列有其他值prefix
(“A”和“B”除外),则必须改进查询,添加更多SUM(IF(prefix = 'A', 1, 0)) AS A
,将字符和列别名更改为预期值。
希望这对你有用!
编辑
根据@bluefeet 评论,您可以根据您的 RDBMS 使用与以下结果相同的命令更改此查询:
CONCAT
: 连接两个或多个字符串;HOUR
:从日期时间(或时间)中提取“小时”部分;TIME
:从日期时间中提取“时间”部分;SUBTIME
:减去两次;ADDTIME
: sum (add) 两次;SUM
并且IF
预计在几乎所有 RDBMS 以及查询的基本结构(SELECT
, FROM
, WHERE
, GROUP BY
)中都以相同的方式工作。