我可以避免这样逐行吗?

时间:2014-11-19 13:35:37

标签: sql sql-server linq entity-framework

如果我有两个带有列的表,如下所示。我想根据该班次内扫描的最早和最晚时间填写ActualStartActualEnd次。

有没有办法在linq中执行此操作或基于set的方式在sql中执行此操作?

目前我打算使用光标并浏览UsersShifts中的每一行,以便在该用户的转变中获得最早和最新的指纹扫描时间,并将其更新为ActualStartActualEnd

UsersShifts

  • UsersShiftsId
  • UserId
  • ShiftStart
  • ShiftEnd
  • ActualStart
  • ActualEnd

FingerprintScan

  • 用户ID
  • ScannedTime

1 个答案:

答案 0 :(得分:2)

只需将时间约束添加到JOIN

,即可在SQL中执行此操作
SELECT 
    us.UsersShiftsId,
    us.UserId,
    us.ShiftStart,
    us.ShiftEnd,
    MIN(fs.ScannedTime) ActualStart,
    MAX(fs.ScannedTime) ActualEnd
FROM UsersShifts us
LEFT JOIN FingerprintScan fs
    ON us.UserId = fs.UserId
    AND fs.ScannedTime BETWEEN us.ShiftStart AND us.ShiftEnd 
GROUP BY
    us.UsersShiftsId,
    us.UserId,
    us.ShiftStart,
    us.ShiftEnd