我的表格如下
Prefix scandate
A 1/2/2013 08:30
A 1/2/2013 08:45
B 1/2/2103 09:15
我需要每小时计数输出i,e
Time A B
08:30-09:30 2 0
09:30-10-30 0 1
直到晚上7点
有人可以帮助我
答案 0 :(得分: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 AM之前的任何时候都不会有效。
答案 1 :(得分: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'));
注意:
查询必须具有这些 sub 和添加次,因此08:30-09:30
之类的时间间隔将更改为08:00-09:00
并且将具有普通时间(正好是09:00,小时是09,而不是08)。
我只尝试使用日期时间函数来达到输出中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
,{{ 1}},WHERE
)。