SQL如何格式化包含聚合或子查询的时间

标签 sql sql-server database winforms

请帮忙。这里有一点问题,需要一些帮助来解决它。我有一个返回多行的查询,当我尝试格式化时间以按照我的意愿显示时,我收到以下消息...

消息 130,级别 15,状态 1,第 3 行 无法对包含聚合或子查询的表达式执行聚合函数。

这是我收到错误时使用的格式...

CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 3600 AS varchar(12)) + ':' + 
RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) / 60 % 60 AS varchar(2)), 2) + ':' + 
RIGHT('0' + CAST(SUM(DATEDIFF(second, 0, EntryTime)) % 60 AS varchar(2)), 2)

当我在查询中运行它时,我得到了我想要的正确格式......

Project Name     Total Time
AAA               0:00:19
BBB               0:00:04
CCC               6:00:06
DDD               16:05:52

但是,我似乎不知道如何格式化以下查询以这种方式显示时间......

SELECT ProjName AS 'Project Name', 
       CONVERT(VARCHAR(10), SUM(CASE WHEN Phone = 0 AND Research = 0 
                                     THEN (DATEDIFF(SECOND, 0, EntryTime))  
                                END)) AS [Total Time No PMRE], 
       CONVERT(VARCHAR(10), SUM(CASE WHEN Phone = 1 AND Research = 0 
                                     THEN (DATEDIFF(SECOND, 0, EntryTime))  
                                END)) AS [Total Time Phone], 
       CONVERT(VARCHAR(10), SUM(CASE WHEN Phone = 0 AND Research = 1 
                                     THEN (DATEDIFF(SECOND, 0, EntryTime)) 
                                END)) AS [Total Time Research], 
       CONVERT(VARCHAR(10), SUM(DATEDIFF(SECOND, 0, EntryTime)) ) AS 'Total Time'
FROM WorkTime
WHERE EntryTime IS NOT NULL
GROUP BY ProjName

并得到以下结果...

Project Name  Total Time No PMRE  Total Time Phone  Total Time Research  Total Time
AAA           19                  NULL              NULL                 19
BBB           4                   NULL              NULL                 4
CCC           10800               7200              3606                 21606
DDD           57952               NULL              NULL                 57952

所有这些都是正确的,但我需要帮助弄清楚如何将时间格式化为小时:分钟:秒...实际上,我不需要秒,只需要小时和分钟,但有任何建议,帮助,指向正确的方向将是美妙的。谢谢!

最佳答案

尝试:

with cte as
(SELECT ProjName , 
        SUM(CASE WHEN Phone = 0 AND Research = 0 THEN DATEDIFF(SECOND, 0, EntryTime) END) AS [Total Time No PMRE], 
        SUM(CASE WHEN Phone = 1 AND Research = 0 THEN DATEDIFF(SECOND, 0, EntryTime) END) AS [Total Time Phone], 
        SUM(CASE WHEN Phone = 0 AND Research = 1 THEN DATEDIFF(SECOND, 0, EntryTime) END) AS [Total Time Research], 
        SUM(DATEDIFF(SECOND, 0, EntryTime)) AS [Total Time]
 FROM WorkTime
 WHERE EntryTime IS NOT NULL
 GROUP BY ProjName)
SELECT ProjName AS [Project Name], 
       CAST([Total Time No PMRE] / 3600 AS varchar(12)) + ':'
       + RIGHT('0' + CAST([Total Time No PMRE] / 60 % 60 AS varchar(2)), 2) + ':'
       + RIGHT('0' + CAST([Total Time No PMRE] % 60 AS varchar(2)), 2) AS [Total Time No PMRE], 
       CAST([Total Time Phone] / 3600 AS varchar(12)) + ':'
       + RIGHT('0' + CAST([Total Time Phone] / 60 % 60 AS varchar(2)), 2) + ':'
       + RIGHT('0' + CAST([Total Time Phone] % 60 AS varchar(2)), 2) AS [Total Time Phone], 
       CAST([Total Time Research] / 3600 AS varchar(12)) + ':'
       + RIGHT('0' + CAST([Total Time Research] / 60 % 60 AS varchar(2)), 2) + ':'
       + RIGHT('0' + CAST([Total Time Research] % 60 AS varchar(2)), 2) AS [Total Time Research], 
       CAST([Total Time] / 3600 AS varchar(12)) + ':'
       + RIGHT('0' + CAST([Total Time] / 60 % 60 AS varchar(2)), 2) + ':'
       + RIGHT('0' + CAST([Total Time] % 60 AS varchar(2)), 2) AS [Total Time]
FROM cte

关于SQL如何格式化包含聚合或子查询的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16547665/

相关文章:

SQL根据字符串模式将单列转换为多行

mysql - 在 SQL 中插入 HTML 字符串查询

java - 我如何使用 jTextField 在数据库中搜索

ruby - 保护 Sinatra 应用程序的最佳实践是什么?

mysql - INSERT IGNORE 即使有警告仍然插入

sql - 优化标签表的表结构

mysql - 如何仅根据月份获取数据?

sql-server - SQL Server 性能 - Subselect 或 Inner Join?

sql-server - 如何在 LINQ 中连接两个表?

mysql - Illuminate\Database\Query\Builder 类的对象无法转换为字符串,无法在单个查询中从两个数据库中获取数据