[MSSQL] 쿼리(월의 일별 시간 추출)관련 문의드립니다. 0 4 1,418

by 라슈 [SQLServer] [2016.05.19 11:40:29]


안녕하세요.

만약 아래와 같은 데이터가 있고 검색조건이 년월일경우(ex : 2015-05)

시작시간 종료시간
2015-05-02 07:55:15.633 2015-05-02 10:50:00.000
2015-05-02 11:15:15.633 2015-05-02 19:50:00.000
2015-05-04 08:10:15.633 2015-05-04 20:00:00.000
2015-05-05 12:30:13.633 2015-05-05 17:58:13.633
2015-05-06 12:40:13.633 2015-05-06 20:18:13.633
2015-05-19 12:50:13.633 2015-05-20 01:05:13.633
2015-05-21 11:24:13.633 2015-05-21 15:00:13.633
2015-05-21 16:04:13.633 2015-05-21 20:00:13.633
2015-05-21 21:02:13.633 2015-05-21 23:05:13.633

 

결과를

날짜 시작시간 종료시간 총 시분
1      
2 AM 07:55 PM 07:50 11 H 30M
3      
4 AM 08:10 PM 08:00 11 H 50M
5 AM 12:30 PM 05:58 5 H 28M
6 AM 12:40 PM 20:18 7 H 38M
7      
8      
: : : :
19 PM 12:50 AM 01:05 12 H 15M
20      
21 AM 11:24 PM 11:05 9 H 35M
: : : :
29      
30      
31      

이와 같은 형식으로 뽑고싶습니다.

검섹한 달의 일자는 데이터가 없어도 다나와야 하고, 해당일의 시작시간을 기준으로 시간과 분을 계산해야합니다.

어떻게 하면 될까요??

고수님들의 답변 기다립니다.

 

 

 

 

 

 

 

 

 

by 마농 [2016.05.19 15:03:46]
WITH calendar_t AS
( -- 해당월 달력 생성 --
SELECT '2015-05' ym
     , DATEADD(d, 0, CONCAT('2015-05', '-01')) dt
     , 1 dd
 UNION ALL
SELECT ym
     , DATEADD(d, 1, dt) dt
     , dd + 1 dd
  FROM calendar_t
 WHERE DATEPART(DAY, DATEADD(d, 1, dt)) != 1
)
, data_t AS
( -- 데이터 테이블 --
SELECT CAST(sdt AS DATETIME) sdt
     , CAST(edt AS DATETIME) edt
  FROM (SELECT '2015-05-02 07:55:15.633' sdt, '2015-05-02 10:50:00.000' edt
        UNION ALL SELECT '2015-05-02 11:15:15.633', '2015-05-02 19:50:00.000'
        UNION ALL SELECT '2015-05-04 08:10:15.633', '2015-05-04 20:00:00.000'
        UNION ALL SELECT '2015-05-05 12:30:13.633', '2015-05-05 17:58:13.633'
        UNION ALL SELECT '2015-05-06 12:40:13.633', '2015-05-06 20:18:13.633'
        UNION ALL SELECT '2015-05-19 12:50:13.633', '2015-05-20 01:05:13.633'
        UNION ALL SELECT '2015-05-21 11:24:13.633', '2015-05-21 15:00:13.633'
        UNION ALL SELECT '2015-05-21 16:04:13.633', '2015-05-21 20:00:13.633'
        UNION ALL SELECT '2015-05-21 21:02:13.633', '2015-05-21 23:05:13.633'
        ) a
)
SELECT c.ym
     , c.dd
     , RIGHT(CONVERT(VARCHAR, sdt, 100), 7) stm
     , RIGHT(CONVERT(VARCHAR, edt, 100), 7) etm
     , CASE WHEN sdt IS NOT NULL THEN CONCAT(mi/60, 'H', ' ', mi%60, 'M') END hh_mi
  FROM calendar_t c
  LEFT OUTER JOIN
       (SELECT DATEPART(DAY, sdt) dd
             , MIN(sdt) sdt
             , MAX(edt) edt
             , SUM(DATEDIFF(MINUTE, sdt, edt)) mi
          FROM data_t
         WHERE sdt >= DATEADD(MONTH, 0, CONCAT('2015-05', '-01'))
           AND sdt <  DATEADD(MONTH, 1, CONCAT('2015-05', '-01'))
         GROUP BY DATEPART(DAY, sdt)
        ) d
    ON c.dd = d.dd
;

 


by 라슈 [2016.05.19 15:34:51]

답변 감사합니다.

많은 도움이 되었습니다.


by 테리 [2016.05.19 15:23:44]

Declare @as_yymm As Char(7)
       ,@ls_from_ymd As Char(10)
       ,@ls_to_ymd   As Char(10)
       ,@li_cnt      As Integer

Select @as_yymm = '2015-05'
      ,@ls_from_ymd = @as_yymm + '-01'
      ,@ls_to_ymd = Dateadd(day,-1,Dateadd(month,1,@ls_from_ymd))
      ,@li_cnt = Abs(DateDiff(day,@ls_from_ymd,@ls_to_ymd)) + 1
;ymd (ymd,seq) As
(
      Select Convert(varchar(max),@ls_from_ymd)
            ,1
 
   Union All
    
      Select Convert(varchar(max),Replace(Convert(char(10),DateAdd(day,1,a.ymd),111),'/','-'))
            ,a.seq + 1
        From ymd a   
       Where a.seq + 1 <= @li_cnt      
)
,tblA(시작시간,종료시간) As
(
      Select '2015-05-02 07:55:15.633','2015-05-02 10:50:00.000'   Union All
      Select '2015-05-02 11:15:15.633','2015-05-02 19:50:00.000'   Union All
      Select '2015-05-04 08:10:15.633','2015-05-04 20:00:00.000'   Union All
      Select '2015-05-05 12:30:13.633','2015-05-05 17:58:13.633'   Union All
      Select '2015-05-06 12:40:13.633','2015-05-06 20:18:13.633'   Union All
      Select '2015-05-19 12:50:13.633','2015-05-20 01:05:13.633'   Union All
      Select '2015-05-21 11:24:13.633','2015-05-21 15:00:13.633'   Union All
      Select '2015-05-21 16:04:13.633','2015-05-21 20:00:13.633'   Union All
      Select '2015-05-21 21:02:13.633','2015-05-21 23:05:13.633'
)  
      Select (
                   Case When Left(SubString(a.ymd,9,2),1) = '0'
                           Then SubString(a.ymd,10,1)
                        Else SubString(a.ymd,9,2)
                   End
             )                           As 날짜
            ,SubString(b.시작시간,12,8)  As 시작시간
            ,SubString(b.종료시간,12,8)  As 종료시간
            ,  Convert(varchar(3),DATEDiff(minute,b.시작시간,b.종료시간)/60) + ' H '
             + Convert(varchar(3),DATEDiff(minute,b.시작시간,b.종료시간)%60 ) + ' M'  As '총 시분'
        From ymd a
                   Left Outer Join
                                   tblA b
                                          On a.ymd = SubString(b.시작시간,1,10)

 


by 라슈 [2016.05.19 15:35:53]

테리님도 답변 감사합니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입