使用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,这样我才能从每天获得最大值。
我已经开了几次而且没有成功。
tblClock :
[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&lt; 0进入where部分。
另外,感谢您正确编辑问题的编辑。前进......