如何在sql中获得小时和分钟的总和

时间:2016-04-14 13:56:25

标签: c# sql-server linq

SELECT LEFT(CONVERT(VARCHAR(10), OutTime - InTime, 108), 5) 
FROM Attendance 
WHERE InTime BETWEEN '01-01-2016' AND '01-31-2016' 
AND Employee=63 
ORDER BY InTime

我得到了这个结果。

[table screenshot[1]

我想要的是所有时间的总和。如何在Linq中编写相同的查询?

2 个答案:

答案 0 :(得分:2)

CREATE TABLE #Attendance(OutTime DateTime, InTime DateTime)

-- Sample Data
insert into  #Attendance( InTime, outTime)
values ('2015-12-12 07:30', '2015-12-12 17:30'),
('2015-12-12 07:30', '2015-12-12 17:30'),
('2015-12-13 07:30', '2015-12-13 16:45'),
('2015-12-14 07:30', '2015-12-14 14:34'),
('2015-12-15 07:30', '2015-12-15 18:21')

-- Use DateDiff function to get total minutes between times to achieve greater accuracy then with 'hour'
-- Convert total minutes to hours after adding up total minutes
SELECT SUM(DATEDIFF(MINUTE, InTime , OutTime)) /60
FROM #Attendance 

DROP TABLE #Attendance

现在有更多LINQ:

public class Attendance
{
    public DateTime InTime { get; set; }
    public DateTime OutTime { get; set; }
}

[TestClass]
public class AttendanceUser
{
    [TestMethod]
    public void UseALambda()
    {
        var rand = new Random();
        var attendances = Enumerable.Range(0, 10).Select(x => 
            new Attendance { InTime = DateTime.Now.AddHours(-rand.Next(x)), OutTime = DateTime.Now.AddHours(rand.Next(x)) }).ToList();

        var total = attendances.Sum(x => (x.OutTime - x.InTime).TotalMinutes) / 60;
    }
}

答案 1 :(得分:0)

SQL Server没有表示时间 span 的日期类型。因此,通常最好将所有内容转换为代表所需结果粒度的int(此处为分钟):

SELECT SUM(DATEDIFF(minute,InTime,OutTime)) as TotalMinutes
FROM Attendance 
WHERE InTime BETWEEN '20160101' AND '20160131' 
AND Employee=63 
--ORDER BY InTime

然后将其转换为表示层中的(天),小时和分钟。

此外,如下所述,如果您想要包含1月最后一天 内发生的事件,请更改WHERE条款:

SELECT SUM(DATEDIFF(minute,InTime,OutTime)) as TotalMinutes
FROM Attendance 
WHERE InTime >= '20160101' AND InTime < '20160201' 
AND Employee=63