使用 SQL Server 2005,我有一个表格,记录datetime
了用户下班的时间。它将这些值存储在一datetime
列中。
有时人们错误地提前下班,然后在正确的时间再次下班。
我的任务是提取用户当天早些时候离开的所有日期。有些日子有两个条目,我必须获得当天的最大条目。他们可能第二次在正确的时间打卡,但他们的第一次仍然在那里。
所以,有一张被称为tblShift
有他们应该打卡的时间的桌子。这是tblShift
. 日期时间值为tblShift.ShiftEnd
。
然后是桌子tblCLock
显示他们的时钟类型的表格。这些可能是轮班结束时的休息或实际打卡,或者是错误的打卡。
这是我这样做的错误方式:
SELECT
clockDateTime,
datediff(n, tblShift.ShiftEnd, tblClock.ClockDateTime) as minutes
from
tblClock
INNER JOIN
tblShift ON tblClock.userid = tblShift.userid
AND Year(tblClock.ClockDateTime) = Year(tblShift.ShiftEnd)
AND Month(tblClock.ClockDateTime) = Month(tblShift.ShiftEnd)
AND Day(tblClock.ClockDateTime) = Day(tblShift.ShiftEnd)
WHERE
tblClock.USERID = 29689 --one of the id's in the table
and clocktypeid = 1
and clockstatusid = 2
and tblShift.ShiftEnd between '2011-11-11 12:00:00 AM' and '2012-11-11 11:59:59 PM'
and tblShift.ShiftTypeID = 1
and datediff(n, tblShift.ShiftEnd, tblClock.ClockDateTime) < 0
ORDER BY
tblClock.clockdatetime desc
发生的情况是,错误的提前下班是在他们错误下班的日子使用,然后在轮班结束时在适当的时间下班。
我试图弄清楚如何在这个查询中使用 MAX,这样我每天只能得到最大值。
我已经重新开始了几次,但都没有成功。
tbl时钟:
[clockID] [int] IDENTITY(1,1) NOT NULL,
[clockStatusID] [int] NULL,
[clockTypeID] [int] NULL,
[userID] [int] NULL,
[clockDateTime] [datetime] NULL CONSTRAINT [DF_tblClock_clockDateTime] DEFAULT (getdate()),
[clockNotes] [text] NULL,
tblShift:
[shiftID] [int] IDENTITY(1,1) NOT NULL,
[shiftTypeID] [int] NULL CONSTRAINT [DF_tblShift_shiftTypeID] DEFAULT ((1)),
[userID] [int] NULL,
[shiftStart] [datetime] NULL,
[shiftEnd] [datetime] NULL,
[shiftNotes] [text] NULL,
更新:我大部分时间都在做这个,并且已经做到了这一点:
SELECT
max(tblClock.clockdatetime) as clockdatetime,
max(tblShift.ShiftEnd),
datediff(n, max(tblShift.ShiftEnd), max(tblClock.ClockDateTime)) as minutes
FROM
tblclock
INNER JOIN
tblShift ON tblClock.userid = tblShift.userid
AND Year(tblClock.ClockDateTime) = Year(tblShift.ShiftEnd)
AND Month(tblClock.ClockDateTime) = Month(tblShift.ShiftEnd)
AND Day(tblClock.ClockDateTime) = Day(tblShift.ShiftEnd)
WHERE
tblClock.userid = 29689
AND
tblClock.clocktypeid = 1
AND
tblClock.clockstatusid = 2
AND
tblShift.ShiftEnd between '2011-10-01 12:00:00 AM' AND '2012-10-01 11:59:59 PM'
AND
tblShift.ShiftTypeID = 1
GROUP BY
Year(tblClock.clockdatetime),Month(tblClock.clockdatetime),day(tblClock.clockdatetime)
ORDER BY
max(tblClock.clockdatetime) desc
我使用我的脚本语言只显示分钟小于零的那些,因为我无法将 AND Minutes < 0 放入 where 部分。
另外,感谢您对问题进行正确措辞的编辑。前进中...