0

使用 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 部分。

另外,感谢您对问题进行正确措辞的编辑。前进中...

4

0 回答 0