문제

내 프로젝트를 관리하기 위해 간단한 시간 추적 프로그램을 작성하고 있습니다. 저는 데이터베이스에서보고 코드를 유지하는 열렬한 팬이므로 송장과 시간 시트 등을 생성하는 몇 가지 스프로크를 만들려고 시도했습니다.

시계 액션, 즉 "펀치 in"및 "펀치 아웃"이 포함 된 테이블이 있습니다. 또한이 작업을 수행 한 사용자, 작업과 관련된 프로젝트 및 현재 날짜/시간이 포함되어 있습니다.

이 테이블에서 특정 시간/프로젝트/및 사용자를 위해 시계를 얻기 위해 선택할 수 있지만, 각 시계와 출력이 총 시간이 포함 된 단일 행으로 변환되도록 집계하려고합니다.

예를 들어 다음은 샘플 출력입니다.

ClockActionID        ActionType DateTime
-------------------- ---------- -----------------------
17                   1          2008-11-08 18:33:56.000
18                   2          2008-11-08 18:33:59.587
19                   1          2008-11-08 18:34:01.023
20                   2          2008-11-08 18:34:02.037
21                   1          2008-11-08 18:45:06.317
22                   2          2008-11-08 18:46:14.597
23                   1          2008-11-08 18:46:16.283
24                   2          2008-11-08 18:46:17.173
25                   1          2008-11-08 18:50:37.830
26                   2          2008-11-08 18:50:39.737
27                   1          2008-11-08 18:50:40.547

(11 row(s) affected)

여기서 ActionType 1은 "Clockin"이고 ActionType 2는 "Clockout"입니다. 또한 간결성에 대한 사용자, 프로젝트 및 설명 열을 가지도록했습니다.

순수한 SQL에서 다음과 같은 결과 세트를 생성해야합니다.

Description   |    Total Time

각 클럭 / 클럭 아웃 쌍에 대해.

나는 이것이 실제로 상당히 단순 할 것이라고 생각합니다. 나는 어떤 방식으로 접근 할 수 있는지 확실하지 않습니다.

편집 : 사용자는 여러 프로젝트에 동시에 클릭 할 수 있지만, 먼저 결과를 단일 프로젝트로 좁히면 여기에서 논리에 차이가 없어야합니다.

도움이 되었습니까?

해결책

나는 디자인이 가장 크지 않다는 데 동의합니다. 시작 말을위한 단일 행이있는 이벤트 기반 구조는 아마도 많은 시간을 절약 할 것입니다. 이 경우 누군가가 시계를 넣을 때 널 끝날로 레코드를 만들 수 있습니다. 그런 다음, 끝 날짜가 클릭을 입력 할 수 있습니다.

그러나 그것은 당신이 요청한 것이 아닙니다. 이것이 당신의 문제에 대한 해결책입니다.

DECLARE @clock TABLE (ClockActionID INT PRIMARY KEY IDENTITY, ActionType INT, ActionDateTime DATETIME)

INSERT INTO @clock (ActionType, ActionDateTime) VALUES (1,'20080101 00:00:00')
INSERT INTO @clock (ActionType, ActionDateTime) VALUES (2,'20080101 00:01:00')
INSERT INTO @clock (ActionType, ActionDateTime) VALUES (1,'20080101 00:02:00')
INSERT INTO @clock (ActionType, ActionDateTime) VALUES (2,'20080101 00:03:00')
INSERT INTO @clock (ActionType, ActionDateTime) VALUES (1,'20080101 00:04:00')
INSERT INTO @clock (ActionType, ActionDateTime) VALUES (2,'20080101 00:05:00')
INSERT INTO @clock (ActionType, ActionDateTime) VALUES (1,'20080101 00:06:00')
INSERT INTO @clock (ActionType, ActionDateTime) VALUES (2,'20080101 00:07:00')
INSERT INTO @clock (ActionType, ActionDateTime) VALUES (1,'20080101 00:08:12')
INSERT INTO @clock (ActionType, ActionDateTime) VALUES (2,'20080101 00:09:00')

-- Get the range
SELECT ActionDateTime CheckIn, 
  (SELECT TOP 1 ActionDateTime 
   FROM @clock C2 
   WHERE C2.ActionDateTime > C.ActionDateTime) CheckOut   
FROM @clock C
WHERE ActionType = 1

-- Get the duration
SELECT DATEDIFF(second, ActionDateTime, 
  (SELECT TOP 1 ActionDateTime 
   FROM @clock C2 
   WHERE C2.ActionDateTime > C.ActionDateTime)
  ) / 60.0 Duration_Minutes
FROM @clock C
WHERE ActionType = 1

테스트를 위해 MS SQL Server와 함께 작동하는 테이블 변수를 사용하고 있습니다. 필요에 따라 변경하십시오. 또한 SQL Server 2000 성능이 좋지 않습니다 이와 같은 쿼리가 있습니다. 테스트 결과는 다음과 같습니다.

CheckIn                 CheckOut
2008-01-01 00:00:00.000 2008-01-01 00:01:00.000
2008-01-01 00:02:00.000 2008-01-01 00:03:00.000
2008-01-01 00:04:00.000 2008-01-01 00:05:00.000
2008-01-01 00:06:00.000 2008-01-01 00:07:00.000
2008-01-01 00:08:12.000 2008-01-01 00:09:00.000

Duration_Minutes
1.000000
1.000000
1.000000
1.000000
0.800000

다른 팁

원래 스토리지 스키마에 결함이 있다고 생각합니다. 당신은 시계의 관점에서 그것을보고 있으므로 시계 작용입니다. 프로젝트의 관점에서 왜 그렇지 않습니까?

테이블 projectAction (projectID, userId, type, start, end)

그런 다음 간단한 그룹이 트릭을 수행해야합니다.

당신은 다음과 같은 것에 대해 생각 했습니까?

  • 누군가가 시계를 잊어 버린 것을 잊어 버렸으므로 두 번의 시계가 보이는 것처럼 보입니까?
  • 누군가가 시계를 잊어 버린다. 그래서 그들은 두 번 시계를 펼친 것처럼 보입니까?

첫 번째 경우, 두 번째 시계를 무시하는 것이 맞습니까? 허용 된 답변은 두 시계인을 동일한 클럭 아웃에 바인딩합니다. 그 맞습니까?

두 번째 경우, 두 번째 시계 아웃은 무시됩니다. 그 맞습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top