2017-12-17 27 views
0

날짜 및 시간 필드에 '2017-12-04 21 : 30 : 00.000'과 같은 기간이 있고 기간이 '1800'이고 '2017-12-04 21 : 30 : 22.000'에있는 항목이있는 경우 '22'를 입력하면 검색어에 '2017-12-04 21 : 30 : 00.000'이 '1800'으로 표시되지만 22 초에는 '2017-12-04 21 : 30 : 00.000'이 표시되지만 내 검색어는 2017-12-04 21 : 00 : 00.000의 지속 시간은 '1822'(합계 1800 + 22)입니다. 나는이 질문을 다른 방식으로이 link이지만 올바른 대답을 얻지 못하여이 질문을 적절한 방법으로 수정할 수 없으므로 여기에 묻습니다.날짜 및 시간 필드 쿼리

검색어 :

SELECT Interval=(CASE WHEN datepart(MINUTE,[DateTime]) = 0 and datepart(SECOND,DateTime)=0 THEN 
CAST(CONVERT(VARCHAR(30),DATEADD(HOUR,-1,[DateTime]),101) + ' '+ cast(format(DATEPART(HOUR,DATEADD(HOUR,-1,[DateTime])),'0#') as varchar)+':30:00' as DateTime) 
ELSE (CAST(CONVERT(VARCHAR(30),[DateTime],101) +' ' + (case when datepart(MINUTE,[DateTime])<=30 and 
datepart(SECOND,[DateTime])<59 
then cast(format(DATEPART(HOUR,[DateTime]),'0#') as varchar)+':00:00' 
     else cast(format(DATEPART(HOUR,[DateTime]),'0#') as varchar)+':30:00' end) as DateTime)) END), 
     ID,Code,Duration=SUM(Duration) FROM Table 
     WHERE [DateTime] >= '2017-12-04 00:00:00' and [DateTime] <= '2017-12-04 23:59:59' 

     GROUP BY (CASE WHEN datepart(MINUTE,[DateTime]) = 0 and datepart(SECOND,DateTime)=0 THEN 
CAST(CONVERT(VARCHAR(30),DATEADD(HOUR,-1,[DateTime]),101) + ' '+ cast(format(DATEPART(HOUR,DATEADD(HOUR,-1,[DateTime])),'0#') as varchar)+':30:00' as DateTime) 
ELSE (CAST(CONVERT(VARCHAR(30),[DateTime],101) +' ' + (case when datepart(MINUTE,[DateTime])<=30 and 
datepart(SECOND,[DateTime])<59 then cast(format(DATEPART(HOUR,[DateTime]),'0#') as varchar)+':00:00' 
     else cast(format(DATEPART(HOUR,[DateTime]),'0#') as varchar)+':30:00' end) as DateTime)) END), 

     ID,Code 
     Order by Interval 

실제 테이블 데이터.

DateTime    ID Code Duration 
2017-12-12 00:30:00 1 12  1800 
2017-12-12 00:30:37 1 12  37 
2017-12-12 01:00:00 1 12  1793 
2017-12-12 01:30:00 1 12  1800 
2017-12-12 01:30:59 1 12  59 

나는 그 결과는 예상 쿼리를 실행하면

DateTime    ID Code Duration 
2017-12-12 00:00:00 1 12  1837 
2017-12-12 00:30:00 1 12  1800 
2017-12-12 01:00:00 1 12  1800 
2017-12-12 01:30:00 1 12  59 

DateTime    ID Code Duration 
2017-12-12 00:00:00 1 12  1800 
2017-12-12 00:30:00 1 12  1800 
2017-12-12 01:00:00 1 12  1800 
2017-12-12 01:30:00 1 12  59 
+1

이 때문에 언어의 장벽을 가능성이 있지만, I 당신이 여기있는 것을 번역하려고 정말로 고심하고 있습니다. 나는 당신의 질의를 게시하는 것이 우리가 그것을 실행할 필요가 없을 때 우리에게 많이 알려주지 않는다고 생각합니다. DDL, 샘플 데이터 및 예상 결과를 게시하는 것이 더 나을 것입니다. – Larnu

+0

@Larnu 예상 결과 세트가있는 샘플 데이터를 추가했습니다. 어떤 것보다 더 필요한 것이 있으면 알려주십시오. –

+0

2 개의 데이터 세트? 승인. 나는 그 결과 집합에 어떻게 도달 할 지에 대한 어떠한 운이나 이유도 볼 수 없습니다. 다른 논리가있는 것 같습니다. 예를 들어, 마지막 행이 존재하지 않을 것으로 예상하고, 행은 첫 행의 논리에 따라 1859의 지속 기간을 갖습니다. 당신의 설명은 분명하지 않습니다. 당신은 당신이 일하는 것을 진술하고있는 것처럼 보이지만 왜 또는 어떻게하지 않습니다. 게시물을 편집 할 수 있습니까? ** 신중하게 ** 처음부터 귀하의 2 데이터 세트를 만드는 뒤에있는 논리를 설명? – Larnu

답변

0
당신은 30 분 간격으로 [날짜 시간] 라운딩 날짜 기능을 사용할 수 있습니다,하지만 결과는 예상 결과와 일치하지 않는

하는 잘못된 것으로 보인다

DateTime    ID Code Duration 
2017-12-12 00:30:00 1 12  1800  1800 + 337 = 1837 2017-12-12 00:30 
2017-12-12 00:30:37 1 12  37 

2017-12-12 01:00:00 1 12  1793     1793 2017-12-12 01:00 

2017-12-12 01:30:00 1 12  1800  1800 + 59 = 1859 2017-12-12 01:30  
2017-12-12 01:30:59 1 12  59 

SQL Fiddle

MS SQL 서버 2014 스키마 설정 :

CREATE TABLE Table1 
    ([DateTime] datetime, [ID] int, [Code] int, [Duration] int) 
; 

INSERT INTO Table1 
    ([DateTime], [ID], [Code], [Duration]) 
VALUES 
    ('2017-12-12 00:30:00', 1, 12, 1800), 
    ('2017-12-12 00:30:37', 1, 12, 37), 
    ('2017-12-12 01:00:00', 1, 12, 1793), 
    ('2017-12-12 01:30:00', 1, 12, 1800), 
    ('2017-12-12 01:30:59', 1, 12, 59) 
; 

검색어 1 :

select 
    dateadd(minute, (datediff(minute, [DateTime], 0)/30) * 30, 0) 
    , sum(duration) 
from table1 
group by 
    dateadd(minute, (datediff(minute, [DateTime], 0)/30) * 30, 0) 

Results :

|      |  | 
|----------------------|------| 
| 1782-01-19T22:30:00Z | 1859 | 
| 1782-01-19T23:00:00Z | 1793 | 
| 1782-01-19T23:30:00Z | 1837 |