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
我已经得到了这个结果。如何在sql中获取小时数和分钟数
[
我要的是所有的时间的总和。我怎样才能在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
我已经得到了这个结果。如何在sql中获取小时数和分钟数
[
我要的是所有的时间的总和。我怎样才能在Linq中编写相同的查询?
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;
}
}
SQL Server不具有代表时间跨度一个 datetype。因此,它通常是最好的一切转化为int
s表示代表你需要的结果的粒度(这里,分):
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
附注:这是你有意忽略了什么在一月的最后一天期间发生的*如果不是,那么'WHERE InTime> ='20160101'和InTime <'20160201''会好得多。 –