1

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

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

在此处输入图像描述

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

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

编辑 :

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

  • 卡号
  • 中间名
  • 个人身份证件
  • 日期
  • 时间
  • YMD
  • HMS
  • 卡号
  • 部门
4

3 回答 3

1

试一试group by

Select employeeID, Date,
    MIN(Time) as InTime, 
    MAX(Time) as OutTime
FROM Transactions
GROUP BY employeeID, Date
于 2013-02-27T06:59:30.943 回答
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

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

于 2013-03-01T05:17:18.113 回答
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上的简单示例

于 2013-02-27T07:39:13.823 回答