选择一年内的最大日期时间列值

时间:2012-11-12 14:29:54

标签: tsql sql-server-2005

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

另外,感谢您正确编辑问题的编辑。前进......

0 个答案:

没有答案