0

我有如下表

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 点

有人能帮我吗

4

2 回答 2

0

根据您使用的数据库,这样的事情应该有效:

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 之前的任何时候都不起作用。

于 2013-05-14T18:17:40.363 回答
0

在 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)中都以相同的方式工作。

于 2013-05-14T20:38:33.797 回答