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
我得到了这个结果。
[
我想要的是所有时间的总和。如何在Linq中编写相同的查询?
答案 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