Sql 如何对存储在varchar列中的时间跨度求和?

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) ) =====================================================

我在MS SQL Server中有一个表,在varchar列中有小时。例如,“4:30”小时:分钟。基本上,这是一个工作量的时间跨度。现在我需要这列的总和。如何转换

我的桌子看起来像这样

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;