Sql 如何对存储在varchar列中的时间跨度求和?
我在MS SQL Server中有一个表,在varchar列中有小时。例如,“4:30”小时:分钟。基本上,这是一个工作量的时间跨度。现在我需要这列的总和。如何转换 我的桌子看起来像这样Sql 如何对存储在varchar列中的时间跨度求和?,sql,sql-server,Sql,Sql Server,我在MS SQL Server中有一个表,在varchar列中有小时。例如,“4:30”小时:分钟。基本上,这是一个工作量的时间跨度。现在我需要这列的总和。如何转换 我的桌子看起来像这样 Create table tblWrkingHors ( Id int primary key, name varchar(50), WorkingHr varchar(8) ) =====================================================
Create table tblWrkingHors
(
Id int primary key,
name varchar(50),
WorkingHr varchar(8)
)
==============================================================
Id name WorkingHr
1 sam 08:20
2 sam 04:50
3 sam 04:34
4 Pam 05:50
5 sam 04:30
6 Pam 06:40
7 Pam 04:50
8 Todd 06:10
9 Todd 05:50
10 Todd 08:50
我的表数据是这样的
Create table tblWrkingHors
(
Id int primary key,
name varchar(50),
WorkingHr varchar(8)
)
==============================================================
Id name WorkingHr
1 sam 08:20
2 sam 04:50
3 sam 04:34
4 Pam 05:50
5 sam 04:30
6 Pam 06:40
7 Pam 04:50
8 Todd 06:10
9 Todd 05:50
10 Todd 08:50
VARCHAR可能不是存储时间的最有效版本,但通过一点转换,您可以完成您想要的任务
WITH cte AS (
SELECT name, SUM(DATEDIFF(MINUTE, '00:00', CAST(WorkingHr AS TIME))) t
FROM mytable GROUP BY name
)
SELECT name, RTRIM(t/60) + ':' + RIGHT('0' + RTRIM(t%60), 2) FROM cte
它基本上是将字符串转换为时间,然后使用DATEDIFF将时间转换为分钟。然后它基本上总结了每个名字的分钟数
外部查询只是使用简单的字符串操作将分钟转换为HH:MM字符串
如果您不希望按名称分组,查询可以简化为
WITH cte AS (
SELECT SUM(DATEDIFF(MINUTE, '00:00', CAST(WorkingHr AS TIME))) t FROM mytable
)
SELECT RTRIM(t/60) + ':' + RIGHT('0' + RTRIM(t%60), 2) FROM cte;
…这是几乎相同的查询,没有分组
MS SQL Server 2012架构设置:
问题1:
:
将时间转换为求和前的分钟数
SELECT
SUM( 60 * CONVERT(int, LEFT( WorkingHr, 2)) +
CONVERT(int, RIGHT(WorkingHr, 2)) ) AS TotalMinutes
FROM tblWorkingHours;
或者,如果您需要每人的金额:
SELECT
name,
SUM( 60 * CONVERT(int, LEFT( WorkingHr, 2)) +
CONVERT(int, RIGHT(WorkingHr, 2)) ) AS TotalMinutes
FROM tblWorkingHours
GROUP BY name;
但是,varchar数据类型可能不是最佳选择。将时间跨度以分钟为单位存储为int。应用程序前端负责以适当的格式转换和显示数据,而不是数据库的责任。因此,选择最适合计算的数据类型,而不是用于显示。我建议一次性清理数据,并实际以数字形式存储数据,可能是NumMinutes int,以便于使用。然后创建一个函数,将分钟数转换为可读格式,并在需要时使用。WorkingHr应该是Times因为它是SQL Server,您可以进一步采纳@JoeEnos的建议,定义小时和分钟的计算列,记录的真实数据以秒为单位存储。DATEDIFF可能从00:00复制,聪明。我从来没有想到过。我建议将其以整数格式重新存储在基表中,以秒为单位,这将更有效地求和。但是,如果这是一次性的,那么像您那样解析它是有意义的。感谢所有回答这个问题的人,也感谢那些尝试这样做的人。我是sql server和c编程方面的新手,在您的帮助和建议下,我将在将来创建表和选择coulmn数据类型时更高效、更准确地做出正确的决策。我会在当前的项目中尝试同样的方法。感谢大家,是的,我为我在评论中的语法错误感到抱歉。我尝试了同样的方法,但得到了错误:在分析过程中发现了1个错误。无法识别的语句类型。近在咫尺0@NarendraVyas听起来像是MySQL错误消息,而不是SQL Server错误消息。您是否真的如问题所示使用SQL Server?您好,先生,您给了我最简单的答案,谢谢。但我试图让您投票赞成,但未能通过。对此表示抱歉,希望您不介意
SELECT
name,
SUM( 60 * CONVERT(int, LEFT( WorkingHr, 2)) +
CONVERT(int, RIGHT(WorkingHr, 2)) ) AS TotalMinutes
FROM tblWorkingHours
GROUP BY name;