用于在办公室中查找进/出时间的SQL查询

时间:2013-02-27 06:55:19

标签: sql sql-server

对于数据库人来说这可能是一个愚蠢的问题,但对我来说这非常艰难,因为这是我第一次看到DATABASE ..我不是DATABASE人,但我必须这样做。

我在SQL SERVER 2005中有DATABASE,并且有一个VIEW包含与员工进/出办公室相关的数据。

enter image description here

特定日期一天可能有超过2个条目,但我们认为一天中的第一个条目是在办公室中的最后一个条目,最后一个条目是从办公室出来的时间,在这些之间这些员工可以出去没有时间,但我们只考虑一天中的第一次和最后一次。

所以我必须为此写下QUERY ......

编辑:

视图中的coloumns列表中还有其他一些coloumn,但我认为没有必要在这里描述..

  • CardSrNo
  • 名字
  • FirstName
  • MidleName
  • PersonalID
  • 日期
  • 时间
  • YMD
  • HMS
  • CardNumber

3 个答案:

答案 0 :(得分:1)

尝试一个好的'group by.

Select employeeID, Date,
    MIN(Time) as InTime, 
    MAX(Time) as OutTime
FROM Transactions
GROUP BY employeeID, Date

答案 1 :(得分:0)

您可以使用ROW_NUMBER()排名功能来确定第一次和最后一次条目

  ;WITH cte AS
 (                             
  SELECT *, ROW_NUMBER() OVER(PARTITION BY PersonalID ORDER BY [Date] ASC, [Time] ASC) AS rnASC,
            ROW_NUMBER() OVER(PARTITION BY PersonalID ORDER BY [Date] DESC, [Time] DESC) AS rnDESC
  FROM dbo.your_tableName
  )
  SELECT *
  FROM cte
  WHERE rnASC = 1 OR rnDESC = 1

SQLFiddle

上的简单示例

或者使用EXISTS运算符选项

SELECT *
FROM dbo.your_tableName t1
WHERE EXISTS (
              SELECT 1
              FROM dbo.your_tableName t2
              WHERE t1.PersonalID = t2.PersonalID
              HAVING (t1.[Date] = MAX(t2.[Date]) AND t1.[Time] = MAX(t2.[Time]))
                OR (t1.[Date] = MIN(t2.[Date]) AND t1.[Time] = MIN(t2.[Time]))
              )

SQLFiddle

上的简单示例

答案 2 :(得分:0)

现在我正在使用该查询:

SELECT FirstName,LastName,CardNumber,Department, Date , MIN(Time) AS intime , MAX(Time) AS outtime ,
convert(varchar(8),(convert(datetime,MAX(Time),110) - convert(datetime,MIN(Time),110)),108) AS Duration
FROM CARDENTRYEXITTRANSACTIONVIEW
GROUP BY FirstName, Date,LastName,CardNumber,Department

它给出了完美的结果............