2017-04-03 4 views
0

오늘 별도의 기록을하게분할 범위는 전 범위 그렇게하기 위해 별도의 기록</p> <p>이되었다 자신의 시간과 두 개의 날짜를 분할 몇 가지 문제가 예를 들어 내가이 샘플을

---------------------------------------------------------------- 
| Record id | date_from    | date_to    | 
---------------------------------------------------------------- 
|  A  | 2017-02-03 08:00:00.000 | 2017-02-04 17:00:00.000| 
---------------------------------------------------------------- 
스크립트 나 절차, 난이 방법에 의해 수행 얻을

---------------------------------------------------------------- 
| Record id | date_from    | date_to    | 
---------------------------------------------------------------- 
|  A  | 2017-02-03 08:00:00.000 | 2017-02-03 23:59:59.000| 
---------------------------------------------------------------- 
|  A  | 2017-02-04 00:00:00.000 | 2017-02-04 17:00:00.000| 
---------------------------------------------------------------- 

방법을 아래에 예상대로이 결과를 얻을 원하는과 다음

? 그리고 그것은 역동적입니다. 대단히 감사합니다 :)

+0

집계 날짜 테이블을 작성한 다음 테이블에 결합하여 수행 할 수 있습니다 – Eric

+0

집계 날짜? 그것이 의미하는 바는 무엇입니까, 당신은 저에게 명확한 모범을 보여줄 수 있습니까? Eric –

답변

1

그런 다음 당신은 또한 시도 할 수 data

;WITH data AS 
(
    SELECT * FROM (VALUES 
     ('A', '2017-02-03 08:00', '2017-02-04 17:00'), 
     ('B', '2017-02-05 08:00', '2017-02-09 17:00') 
    ) t(RecordId, date_from, date_to) 
) 
,tally AS 
(
    -- It just build on the fly, 
    -- actually you can prebuild the table somewhere with DateValue as a key 
    SELECT MIN(CAST(date_from AS date)) AS DateValue, MAX(CAST(date_to AS date)) MaxDate FROM data 
    UNION ALL SELECT DATEADD(DAY, 1, DateValue), MaxDate FROM tally WHERE DateValue < MaxDate 
) 
SELECT 
    RecordId, 
    CASE 
     WHEN CAST(date_from AS date) = DateValue THEN date_from 
     ELSE CAST(DateValue AS datetime) 
    END AS date_from, 
    CASE 
     WHEN CAST(date_to AS date) = DateValue THEN date_to 
     ELSE DATEADD(SECOND, -1, DATEADD(DAY, 1, CAST(DateValue AS datetime))) 
    END AS date_to 
FROM 
    -- The joining condition creates the product effect for date range into separate dates 
    data INNER JOIN tally ON DateValue BETWEEN data.date_from AND data.date_to 

https://data.stackexchange.com/stackoverflow/query/652790

+0

와우, 나는 그것을 먼저 시도 할 것입니다. 당신의 질문에 일반적인 과정을 설명해 주시겠습니까? @eric –

+0

@FarisFajar 코드에 – Eric

+0

이 (가) 매우 감사하게 추가되었습니다. 신의 축복이 당신의 일을합니다 :) –

0

테이블과 조인 집계 날짜 테이블을 구축하여 수행 할 수 있습니다와 같은 :

DECLARE @StartDate DATETIME='2017-02-04 17:00:00.000', 
     @EndDate DATETIME = '2017-02-05 17:00:00.000' 
SELECT DateAdd(DAY, nbr - 1, @StartDate) AS date_from, 
     DateAdd(DAY, nbr - 1, GetDate()) AS date_to 
FROM 
    (SELECT ROW_NUMBER() OVER (
          ORDER BY c.object_id) AS Nbr 
    FROM sys.columns c) nbrs 
WHERE nbr - 1 <= DATEDIFF(DAY, @StartDate, @EndDate) 
+0

나는 당신의 질문을 시도 할 것입니다 :) 감사합니다 @ 라제 쉬 –