안녕하세요.
만약 아래와 같은 데이터가 있고 검색조건이 년월일경우(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 |
이와 같은 형식으로 뽑고싶습니다.
검섹한 달의 일자는 데이터가 없어도 다나와야 하고, 해당일의 시작시간을 기준으로 시간과 분을 계산해야합니다.
어떻게 하면 될까요??
고수님들의 답변 기다립니다.
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 ;
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)