2015-12-18 2 views
0

Итак, у меня возник вопрос о создании двух столбцов из столбца datetime.Создайте два столбца из столбца datetime

Моего пример

CREATE TABLE #Test (ID int, OK bit, Data datetime) 
INSERT INTO #Test VALUES (1,0,'Dec 1 2015 12:00AM') 
INSERT INTO #Test VALUES (2,1,'Dec 2 2015 12:00AM') 
INSERT INTO #Test VALUES (3,1,'Dec 3 2015 12:00AM') 
INSERT INTO #Test VALUES (4,1,'Dec 4 2015 12:00AM') 
INSERT INTO #Test VALUES (5,0,'Dec 5 2015 12:00AM') 
INSERT INTO #Test VALUES (6,0,'Dec 6 2015 12:00AM') 
INSERT INTO #Test VALUES (7,1,'Dec 7 2015 12:00AM') 
INSERT INTO #Test VALUES (8,1,'Dec 8 2015 12:00AM') 
INSERT INTO #Test VALUES (9,1,'Dec 9 2015 12:00AM') 
INSERT INTO #Test VALUES (10,1,'Dec 10 2015 12:00AM') 
INSERT INTO #Test VALUES (11,1,'Dec 11 2015 12:00AM') 
INSERT INTO #Test VALUES (12,0,'Dec 12 2015 12:00AM') 
INSERT INTO #Test VALUES (13,0,'Dec 13 2015 12:00AM') 
INSERT INTO #Test VALUES (14,1,'Dec 14 2015 12:00AM') 
INSERT INTO #Test VALUES (15,1,'Dec 15 2015 12:00AM') 
INSERT INTO #Test VALUES (16,1,'Dec 16 2015 12:00AM') 
INSERT INTO #Test VALUES (17,1,'Dec 17 2015 12:00AM') 
INSERT INTO #Test VALUES (18,1,'Dec 18 2015 12:00AM') 
INSERT INTO #Test VALUES (19,0,'Dec 19 2015 12:00AM') 
INSERT INTO #Test VALUES (20,0,'Dec 20 2015 12:00AM') 
INSERT INTO #Test VALUES (21,1,'Dec 21 2015 12:00AM') 
INSERT INTO #Test VALUES (22,1,'Dec 22 2015 12:00AM') 
INSERT INTO #Test VALUES (23,1,'Dec 23 2015 12:00AM') 
INSERT INTO #Test VALUES (24,1,'Dec 24 2015 12:00AM') 
INSERT INTO #Test VALUES (25,0,'Dec 25 2015 12:00AM') 
INSERT INTO #Test VALUES (26,0,'Dec 26 2015 12:00AM') 
INSERT INTO #Test VALUES (27,0,'Dec 27 2015 12:00AM') 
INSERT INTO #Test VALUES (28,1,'Dec 28 2015 12:00AM') 
INSERT INTO #Test VALUES (29,1,'Dec 29 2015 12:00AM') 
INSERT INTO #Test VALUES (30,1,'Dec 30 2015 12:00AM') 

которые производят следующий результат

ID OK Data 
-------------------- 
1 0 2015-12-01 00:00:00.000 
2 1 2015-12-02 00:00:00.000 
3 1 2015-12-03 00:00:00.000 
4 1 2015-12-04 00:00:00.000 
5 0 2015-12-05 00:00:00.000 
6 0 2015-12-06 00:00:00.000 
7 1 2015-12-07 00:00:00.000 
8 1 2015-12-08 00:00:00.000 
9 1 2015-12-09 00:00:00.000 
10 1 2015-12-10 00:00:00.000 
11 1 2015-12-11 00:00:00.000 
12 0 2015-12-12 00:00:00.000 
13 0 2015-12-13 00:00:00.000 
14 1 2015-12-14 00:00:00.000 
15 1 2015-12-15 00:00:00.000 
16 1 2015-12-16 00:00:00.000 
17 1 2015-12-17 00:00:00.000 
18 1 2015-12-18 00:00:00.000 
19 0 2015-12-19 00:00:00.000 
20 0 2015-12-20 00:00:00.000 
21 1 2015-12-21 00:00:00.000 
22 1 2015-12-22 00:00:00.000 
23 1 2015-12-23 00:00:00.000 
24 1 2015-12-24 00:00:00.000 
25 0 2015-12-25 00:00:00.000 
26 0 2015-12-26 00:00:00.000 
27 0 2015-12-27 00:00:00.000 
28 1 2015-12-28 00:00:00.000 
29 1 2015-12-29 00:00:00.000 
30 1 2015-12-30 00:00:00.000 

Так что мой вопрос заключается в том, как я могу создать таблицу из двух столбцов без использования курсора или времени.

Выход должен быть. Я знаю, что могу добиться этого, используя курсор, но это должен быть более простой способ. Любая помощь?

StartDate     EndDate 
    ----------------------- ----------------------- 
    2015-12-02 00:00:00.000 - 2015-12-04 00:00:00.000 
    2015-12-07 00:00:00.000 - 2015-12-11 00:00:00.000 
    2015-12-14 00:00:00.000 - 2015-12-18 00:00:00.000 
    2015-12-21 00:00:00.000 - 2015-12-24 00:00:00.000 
    2015-12-28 00:00:00.000 - 2015-12-30 00:00:00.000 
+0

Ваш вопрос, как сделать это с помощью запроса, потому что, когда вы говорите «создать таблицу из двух столбцов», то вы можете просто сделать то, что вместо одного одного? И если запрос - в чем же заключается логика? –

+0

Да, я хотел бы сделать это в запросе. – CiucaS

ответ

3

Вы можете использовать следующий запрос:

SELECT MIN(Data) AS StartDate, 
     MAX(Data) AS EndDate 
FROM (
    SELECT ID, OK, Data, 
     DATEADD(d, -1 * ROW_NUMBER() OVER 
         (PARTITION BY OK ORDER BY ID), Data) AS grp 
    FROM Test) AS t 
WHERE OK = 1 
GROUP BY grp 

Запрос использует вычисляемое поле grp для идентификации островки последовательных записей, имеющих последовательные даты жгутов тот же OK кусочка.

Demo here

+0

Спасибо! Это то, что я искал. – CiucaS

Смежные вопросы