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
운영게시판
최근게시물
MySQL Q&A 31334 게시물 읽기
No. 31334
특정시간이 포함된 시간을 구하고 싶습니다.
작성자
피어스
작성일
2021-03-29 15:19
조회수
215

안녕하세요 쿼리 도움좀 요청합니다.


A라는 근로자가 3/1일 저녁6시(18시) 부터 다음날(3/2) 새벽 4시까지 일을 했을경우

심야시간 근로한 시간을 구하고자 합니다.

심야시간은 22시부터 다음날 06시까지가 심야시간으로 정해져있습니다.


예) 구분    시작시간                       종료시간                         원하는 데이타값

      A      2021-03-01 18:00:00      2021-03-02 04:00:00                  6시간


고수님들의 도움 부탁드립니다.


감사합니다.



 

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

종료시간에서 지정된 시간을 빼면 되지 않을까요? 방법은 여러가지 있을것 같은데.. 제가 해본것 올립니다.


select timestampdiff(hour,'2021-03-01 22:00:00', edt) diff

from (select '2021-03-01 18:00:00' sdt, '2021-03-02 04:00:00'  edt) t

where sdt < '2021-03-01 22:00:00'



select timestampdiff(hour, concat(date_sub(date(edt) , interval 1 day), ' 22:00:00'), edt) diff

from (select '2021-03-01 18:00:00' sdt, '2021-03-02 04:00:00'  edt) t

where sdt < concat(date_sub(date(edt) , interval 1 day), ' 22:00:00')

정상규(pajama)님이 2021-03-29 16:03에 작성한 댓글입니다.
이 댓글은 2021-03-29 16:08에 마지막으로 수정되었습니다.
WITH t AS
(
SELECT 1 idx, 'A' nm, '2021-03-01 18:00:00' sdt, '2021-03-02 04:30:00' edt
UNION ALL SELECT 2, 'A', '2021-03-04 05:30:00', '2021-03-04 23:30:00'
UNION ALL SELECT 3, 'B', '2021-03-04 09:00:00', '2021-03-04 18:00:00'
UNION ALL SELECT 4, 'C', '2021-03-01 18:00:00', '2021-03-02 08:00:00'
UNION ALL SELECT 5, 'D', '2021-03-01 23:00:00', '2021-03-02 08:00:00'
UNION ALL SELECT 6, 'E', '2021-02-28 23:00:00', '2021-03-02 08:00:00'
)
SELECT idx, nm, sdt, edt
     , ROUND(
       SUM(CASE WHEN x < y THEN TIME_TO_SEC(TIMEDIFF(y, x)) ELSE 0 END)
       /60/60, 2) hours
  FROM (SELECT idx, nm, sdt, edt
             , GREATEST(s, DATE(s) + INTERVAL seq-1 DAY + INTERVAL 0 hour) x
             , LEAST   (e, DATE(s) + INTERVAL seq-1 DAY + INTERVAL 8 hour) y
          FROM (SELECT idx, nm, sdt, edt
                     , sdt + INTERVAL 2 HOUR s
                     , edt + INTERVAL 2 HOUR e
                  FROM t
                ) a
           LEFT OUTER JOIN
                (SELECT 1 seq
                 UNION ALL SELECT 2
                 UNION ALL SELECT 3
                 ) b
             ON seq <= DATEDIFF(DATE(e), DATE(s)) + 1
        ) a
 GROUP BY idx, nm, sdt, edt
;
야간 22시~06시 로 계산하기가 까다로워 원래의 시간을 2시간 이동시켜 0시~8시를 야간으로 간주하는 방식입니다. 여러날 걸쳐 근무가 가능하다고 보고 일별로 행 복제 한 뒤 일별 0시~8시 사이 시간을 계산하여 합산하는 방식입니다.
마농(manon94)님이 2021-03-31 08:09에 작성한 댓글입니다.
이 댓글은 2021-03-31 08:09에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
31338데이터베이스 분리 [1]
김군
2021-05-02
110
31337MYSQL 인덱스 및 제약조건 생성시 [1]
축구선수
2021-04-27
107
31336상태값을 쿼리로 구하려 합니다. [1]
안용재
2021-04-07
221
31334특정시간이 포함된 시간을 구하고 싶습니다. [2]
피어스
2021-03-29
215
31333mysqldump 파일명 지정 관련 질문 [2]
왕초보
2021-03-17
282
31332php 에서 원격 mysql 접속
AALS
2021-03-05
260
31330재귀호출에 의한 하이락키 구조의 트리형태의 정렬 [4]
김씨
2021-01-22
507
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2021 DSN, All rights reserved.
작업시간: 0.011초, 이곳 서비스는
	PostgreSQL v13.1으로 자료를 관리합니다