SQL - 使用汇总计算小时总和
SQL - Calculate Hours sum using rollup
我希望获得所有小时数的总和作为最后一行的摘要。我正在使用以下查询来获取结果:
create table time_test (type varchar(10),time varchar(10))
insert into time_test values ('A','01:25')
insert into time_test values ('B','02:30')
insert into time_test values ('C','05:56')
insert into time_test values ('D','00:50')
--select * from time_test
SELECT
type = ISNULL(type, 'Total'),
time = substring((cast(sum(((cast(substring (time,2,1) as decimal)*60 + cast(substring (time,4,2) as decimal))/60)) as varchar(10))),1,2)+':' + cast((cast((round(((cast((((cast((substring((cast((sum(((cast(substring (time,2,1) as decimal)*60 + cast(substring (time,4,2) as decimal))/60))) as varchar(10))),4,2)) as int))*60)) as decimal)/100)),0)) as int)) as varchar(10))
FROM time_test
GROUP BY ROLLUP(type);
输出:
如您所见,除了总计算工作正常外,时间还不正确。
问题:
请让我知道我在显示数据时哪里做错了。
提前致谢。
我会首先修正你的数据类型,时间应该存储为 time
,而不是 varchar
。然后,一旦你修复了你的数据类型,你就可以按原样对待你的数据(一次)。
USE Sandbox;
GO
CREATE TABLE dbo.time_test ([type] varchar(10),
[time] time);
INSERT INTO dbo.time_test
VALUES ('A', '01:25'); --Assumes hh:mm
INSERT INTO dbo.time_test
VALUES ('B', '02:30');
INSERT INTO dbo.time_test
VALUES ('C', '05:56');
INSERT INTO dbo.time_test
VALUES ('D', '00:50');
GO
SELECT ISNULL([type],'Total') AS [Type],
DATEADD(MINUTE,SUM(DATEDIFF(MINUTE,'00:00',[time])),CONVERT(time(0),'00:00')) AS [Time]
FROM dbo.time_test
GROUP BY [type] WITH ROLLUP;
GO
DROP TABLE dbo.time_test;
这个returns:
Type Time
---------- ----------------
A 01:25:00
B 02:30:00
C 05:56:00
D 00:50:00
Total 10:41:00
我也有类似的需求,是这样解决的:
select type, RTRIM(time/60) + ':' + RIGHT('0' + RTRIM(time%60),2) from
(
select type= ISNULL(type, 'Total'),
time= SUM(DATEDIFF(MINUTE, '0:00:00', time))
from time_test
GROUP BY ROLLUP(type)
) x
我相信这样更容易理解也更容易追踪
type time
A 1:25
B 2:30
C 5:56
D 0:50
Total 10:41
编辑:更新了 hour can be more then 24 hours
的查询
select type, RTRIM(time/60) + ':' + RIGHT('0' + RTRIM(time%60),2) from
(
select type= ISNULL(type, 'Total'),
time= SUM(DATEDIFF(MINUTE, '0:00:00',
DATEADD(day, SUBSTRING(time,0,CHARINDEX(':',time,0)) / 24,
DATEADD(hour, SUBSTRING(time,0,CHARINDEX(':',time,0)) % 24,
DATEADD(minute,SUBSTRING(time,CHARINDEX(':',time)+1,LEN(time)) +0, 0)) )))
from time_test
GROUP BY ROLLUP(type)
) x
示例结果:
A 1:25
B 2:30
C 5:56
D 70:50
Total 80:41
好的,代码审查速度如此之快,尽量避免使用 VARCHAR 数据类型来存储日期 and/or 时间。
下面是我做的:
create table time_test (type varchar(10),time1 time)
insert into time_test values ('A','00:01:30')
insert into time_test values ('B','00:02:30')
insert into time_test values ('C','00:01:00')
insert into time_test values ('D','00:02:30')
SELECT
type = ISNULL(type, 'Total'),
seconds_worked = SUM(DATEDIFF(SECOND, '00:00', time1))
FROM time_test
GROUP BY ROLLUP(type);
你会看到 Total 达到 450,如果你根据提供的数据手动计算似乎是正确的,即总时间是 450 秒。
您可以使用以下公式 return 您的时间(以分钟和秒为单位):
RTRIM(**450**/60) + ':' + RIGHT('0' + RTRIM(**450**%60),2)
我希望获得所有小时数的总和作为最后一行的摘要。我正在使用以下查询来获取结果:
create table time_test (type varchar(10),time varchar(10))
insert into time_test values ('A','01:25')
insert into time_test values ('B','02:30')
insert into time_test values ('C','05:56')
insert into time_test values ('D','00:50')
--select * from time_test
SELECT
type = ISNULL(type, 'Total'),
time = substring((cast(sum(((cast(substring (time,2,1) as decimal)*60 + cast(substring (time,4,2) as decimal))/60)) as varchar(10))),1,2)+':' + cast((cast((round(((cast((((cast((substring((cast((sum(((cast(substring (time,2,1) as decimal)*60 + cast(substring (time,4,2) as decimal))/60))) as varchar(10))),4,2)) as int))*60)) as decimal)/100)),0)) as int)) as varchar(10))
FROM time_test
GROUP BY ROLLUP(type);
输出:
如您所见,除了总计算工作正常外,时间还不正确。
问题: 请让我知道我在显示数据时哪里做错了。
提前致谢。
我会首先修正你的数据类型,时间应该存储为 time
,而不是 varchar
。然后,一旦你修复了你的数据类型,你就可以按原样对待你的数据(一次)。
USE Sandbox;
GO
CREATE TABLE dbo.time_test ([type] varchar(10),
[time] time);
INSERT INTO dbo.time_test
VALUES ('A', '01:25'); --Assumes hh:mm
INSERT INTO dbo.time_test
VALUES ('B', '02:30');
INSERT INTO dbo.time_test
VALUES ('C', '05:56');
INSERT INTO dbo.time_test
VALUES ('D', '00:50');
GO
SELECT ISNULL([type],'Total') AS [Type],
DATEADD(MINUTE,SUM(DATEDIFF(MINUTE,'00:00',[time])),CONVERT(time(0),'00:00')) AS [Time]
FROM dbo.time_test
GROUP BY [type] WITH ROLLUP;
GO
DROP TABLE dbo.time_test;
这个returns:
Type Time
---------- ----------------
A 01:25:00
B 02:30:00
C 05:56:00
D 00:50:00
Total 10:41:00
我也有类似的需求,是这样解决的:
select type, RTRIM(time/60) + ':' + RIGHT('0' + RTRIM(time%60),2) from
(
select type= ISNULL(type, 'Total'),
time= SUM(DATEDIFF(MINUTE, '0:00:00', time))
from time_test
GROUP BY ROLLUP(type)
) x
我相信这样更容易理解也更容易追踪
type time
A 1:25
B 2:30
C 5:56
D 0:50
Total 10:41
编辑:更新了 hour can be more then 24 hours
select type, RTRIM(time/60) + ':' + RIGHT('0' + RTRIM(time%60),2) from
(
select type= ISNULL(type, 'Total'),
time= SUM(DATEDIFF(MINUTE, '0:00:00',
DATEADD(day, SUBSTRING(time,0,CHARINDEX(':',time,0)) / 24,
DATEADD(hour, SUBSTRING(time,0,CHARINDEX(':',time,0)) % 24,
DATEADD(minute,SUBSTRING(time,CHARINDEX(':',time)+1,LEN(time)) +0, 0)) )))
from time_test
GROUP BY ROLLUP(type)
) x
示例结果:
A 1:25
B 2:30
C 5:56
D 70:50
Total 80:41
好的,代码审查速度如此之快,尽量避免使用 VARCHAR 数据类型来存储日期 and/or 时间。
下面是我做的:
create table time_test (type varchar(10),time1 time)
insert into time_test values ('A','00:01:30')
insert into time_test values ('B','00:02:30')
insert into time_test values ('C','00:01:00')
insert into time_test values ('D','00:02:30')
SELECT
type = ISNULL(type, 'Total'),
seconds_worked = SUM(DATEDIFF(SECOND, '00:00', time1))
FROM time_test
GROUP BY ROLLUP(type);
你会看到 Total 达到 450,如果你根据提供的数据手动计算似乎是正确的,即总时间是 450 秒。
您可以使用以下公式 return 您的时间(以分钟和秒为单位):
RTRIM(**450**/60) + ':' + RIGHT('0' + RTRIM(**450**%60),2)