database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Q&A 7352 게시물 읽기
No. 7352
초짜입니다. 고수님들 도움을...
작성자
임병민(rockguy)
작성일
2008-02-29 00:04ⓒ
2008-02-29 16:29ⓜ
조회수
5,780

하루 근무 시간을 계산해서 일반(근무시간 내) 근무 시간과 Over Time(근무시간 외)을 따로 끌어내고 싶습니다.

아래와 같은 Table에서 
+----------------------------------------------+
| plan_id   | name | start_time | end_time | work |
+----------------------------------------------+

근무시간은 09:00 ~ 18:00 이며, 점심시간 (12:00 - 13:00)은 근무 시간에서 제외 됩니다.
그밖의 근무 시간은 Over time으로 계산합니다.

동일 근무자가 다수의 record를 가질 수 있음으로,
각각의 근무시간과 Over Time은 누적치를 최종적으로 끌어내야 합니다.
예를 들어 한달동안 근무자의 근무 시간과 Over Time을 다수의 record로 부터 잡아 내고 싶습니다.
PostresSQL은 처음이라 Query를 어떻게 해야할지 막막합니다.
도움 부탁 드립니다.


-------------------------------------------------
아래 회신 주신분들 감사드립니다.
상기 Table은 간단한 예를 들은 것으로 실재 운용중인 Table은 아닙니다.
mySQL에서 하기의 Query로 원하는 결과를 얻었습니다만,
PostresSQL로 Migration하려는데 이 부분이 잘 처리가되지 않아서 도움을 청하고 있습니다.
아래 mySQL 에서의 Query를 PostresSQL에서의 Query로 바꾸고자 합니다.
도움 부탁 드립니다.

  strSQL = "SELECT *,COUNT(*) AS PlanCount,SUM(myDayWorkTime) AS UsedTime,SUM(myOverTime) AS OverTime FROM " & _
  "(SELECT C.ProjNo,C.WorkID,C.EQType,A.Author,A.Customer,A.FabName,A.RBUName,A.State,A.EvtCategory, " & _
  "@T1:=TIMEDIFF(A.EndTime,A.StartTime) AS A1, " & _
  "@T2:=HOUR(@T1) AS A2, " & _
  "@T3:=MINUTE(@T1) AS A3, " & _
  "IF(TIME(A.StartTime) <= '12:00' AND TIME(A.EndTime) >= '13:00', " & _
  " @myTotalTime:=ROUND(@T2+(@T3/60)-1,1), " & _
  " @myTotalTime:=ROUND(@T2+(@T3/60),1)) AS A4, " & _
  "IF((TIME(A.StartTime) <= '09:00' AND TIME(A.EndTime) <= '09:00') OR (TIME(A.StartTime) >= '18:00' AND TIME(A.EndTime) >= '18:00')," & _
  " @T1:=TIMEDIFF(A.EndTime,A.StartTime), "& _
  " @T1:='00:00') AS A5, " & _
  "@T2:=HOUR(@T1) AS A6, " & _
  "@T3:=MINUTE(@T1) AS A7, " & _
  "@myOverTime:=ROUND(@T2+(@T3/60),1) AS A8, " & _
  "IF(TIME(A.StartTime) < '09:00' AND TIME(A.EndTime) > '09:00'," & _
  " @T1:=TIMEDIFF('09:00',TIME(A.StartTime)), "& _
  " @T1:='00:00') AS A9, " & _
  "@T2:=HOUR(@T1) AS A10, " & _
  "@T3:=MINUTE(@T1) AS A11, " & _
  "@myOverTime:=@myOverTime + ROUND(@T2+(@T3/60),1) AS A12, " & _
  "IF(TIME(A.StartTime) < '18:00' AND TIME(A.EndTime) > '18:00'," & _
  " @T1:=TIMEDIFF(TIME(A.EndTime),'18:00'), "& _
  " @T1:='00:00') AS A13, " & _
  "@T2:=HOUR(@T1) AS A14, " & _
  "@T3:=MINUTE(@T1) AS A15, " & _
  "@myOverTime:=@myOverTime + ROUND(@T2+(@T3/60),1) AS myOverTime, " & _
  "@myDayWorkTime:=@myTotalTime - @myOverTime AS myDayWorkTime " & _
  "FROM PlanTable A " & _
  "LEFT JOIN ProjectMaster.ProjectMainTable C ON A.ProjNo=C.ProjNo " & _
  "LEFT JOIN ProjectMaster.ActionPlanTable B ON A.APID = B.APID "
  :

이 글에 대한 댓글이 총 2건 있습니다.

원하시는 답변은 아니겠지만
work_time 일반(근무시간 내) 근무 시간
over_time Over Time(근무시간 외)
필드를 추가하여 계산을 필드 입력시 프로그램이 하는것이 어떨까요?

24시를 지나거나 하루를 넘는등 경우의 수가 있어 쿼리로 쉬워 보이지는 않는군요

그냥님이 2008-02-29 09:59에 작성한 댓글입니다. Edit

근태관리의 일반적인 모습은

아르바이트직과 상근직으로 나누는 것이 일반적입니다.

그래서, 상근직일 경우는 그 근무시간과 관계없이,

출근, 지각, 조퇴, 결근 ... 이런식의 상태값으로 구분하고요.

시간외근무에 대해서는 몇시부터 몇시까지 이런식으로 처리합니다.

아르바이트직일 경우는 근무 시작시간과 마침시간으로 나눌터이고.

즉, 자료구조가 단순히 저 형태일 수 없을 것 같습니다.


상근직일 경우의 한달 근무시간을 뽑아야한다면,

정상 출근 * 정상업무시간 + 지각 * 지각 업무 시간 + 조퇴 *   근무시간  + 시간외근무

이런식으로 합계를 내겠죠.


그리고 그 외, 출퇴근 근거 형태로 언제 출근했고 언제 퇴근했고... 이런식의 자료가 있고,


단지 윗 자료구조형태가 아니라,

근태관리쪽으로도 한 두어개의 테이블이 더 만들어질겝니다.

시간외 근무에 대해서는 직속상관의 결제도 있어야하니,

좀 더 고민해보세요.


제가 보기에는 쿼리의 문제가 아닌듯합니다.

김상기(ioseph)님이 2008-02-29 14:26에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7361배열과 FK [2]
이리
2008-03-04
5819
7360시퀀스 문제 [3]
초짜군
2008-03-01
6333
7353SET client_encoding='SJIS' 이것을 psql 이시작하면서 부터 클라이언트 인코딩을 이것으로 고정하려고하는데요 잘안되네요. [4]
김대헌
2008-02-29
6184
7352초짜입니다. 고수님들 도움을... [2]
임병민
2008-02-29
5780
7351쿼리를 날리면 연결이 끈겨요... [5]
초짜군
2008-02-27
6350
7350시간을 다시 셋팅하려면 어떻게 해야하지요? [1]
엿성
2008-02-27
6169
7349PostgreSQL을 배우려는 초짜입니다 [1]
오윤택
2008-02-26
5782
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다