Объединение двух полей даты и времени в два отдельных столбца в T-SQL - PullRequest
3 голосов
/ 10 февраля 2010

Я пытаюсь создать представление, отображающее события с начальным и конечным временем. Это представление должно быть получено из существующей таблицы, которая имеет только поле времени события и поле типа события.

Итак, текущий EventTable выглядит так:

EventTime       | BooleanField
------------------------------
1/1/2010 6:00AM        1
1/2/2010 6:00AM        0
1/3/2010 6:00AM        1
1/4/2010 6:00AM        1
1/5/2010 6:00AM        0

И набор результатов должен выглядеть следующим образом

StartTime       | EndTime
-----------------------------
1/1/2010 6:00AM   1/2/2010 6:00AM
1/3/2010 6:00AM   1/5/2010 6:00AM

Таким образом, представление должно отображать периоды, когда логическое поле имеет значение true.

Есть ли простое решение для достижения этой цели в SQL Server 2008?

Спасибо за помощь!

Ответы [ 3 ]

3 голосов
/ 10 февраля 2010

вы можете попробовать что-то вроде ( полный пример )

DECLARE @EventTable TABLE(
        EventTime DATETIME,
        BooleanField INT
)

INSERT INTO @EventTable (EventTime,BooleanField) SELECT '1/1/2010 6:00AM',1 
INSERT INTO @EventTable (EventTime,BooleanField) SELECT '1/2/2010 6:00AM',0 
INSERT INTO @EventTable (EventTime,BooleanField) SELECT '1/3/2010 6:00AM',1 
INSERT INTO @EventTable (EventTime,BooleanField) SELECT '1/4/2010 6:00AM',1 
INSERT INTO @EventTable (EventTime,BooleanField) SELECT '1/5/2010 6:00AM',0

;WITH Dates AS (
        SELECT  *,
                (SELECT MIN(EventTime) FROM @EventTable WHERE EventTime > e.EventTime AND BooleanField = 0) EndDate
        FROM    @EventTable e
        WHERE   BooleanField = 1
)
SELECT  MIN(EventTime) StartDate,
        EndDate
FROM    Dates
GROUP BY EndDate
1 голос
/ 10 февраля 2010

Попробуйте это:

SELECT MIN(iq.StartTime), iq.EndTime
FROM 
(
    SELECT e1.EventTime AS StartTime, MIN(e2.EventTime) AS EndTime
    FROM EventTable e1
    LEFT JOIN EventTable e2 ON e2.BooleanField = 0 AND e2.EventTime > e1.EventTime
    WHERE e1.BooleanField = 1
    GROUP BY e1.EventTime 
) iq
GROUP BY iq.EndTime

Это гарантирует, что вы получите только самые широкие возможные интервалы для каждого имеющегося у вас EndTime. Я почти уверен, что невозможно упростить это в запросе с одним SELECT из-за необходимости двух предложений GROUP BY - даже с учетом других примеров (которые используют неявную группировку с использованием двух разных функций агрегирования, поэтому эквивалентны пример).

0 голосов
/ 10 февраля 2010

А как же

  Select s.EventTime StartTime,
         e.EventTime EndTime
  From EventTable s
     Left Join EventTable e 
         On s.BooleanFiels = 1
            And e.BooleanField = 0
            And e.EventTime =
               (Select Min(EventTime) 
                From EventTable 
                Where e.BooleanField = 0
                   And EventTime > s.EventTime)
  Order By s.EventTime
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...