Как узнать, есть ли время в SQL Server 2008 - PullRequest
2 голосов
/ 26 марта 2011

У меня есть таблица, содержащая несколько интервалов времени (в виде двух TIME столбцов)

Например:

TimeBegin        TimeEnd
---------------- ----------------
00:00:00.0000000 01:00:00.0000000
01:00:00.0000000 02:00:00.0000000
01:30:00.0000000 03:00:00.0000000

Мне нужно выяснить, образуют ли промежутки времени последовательность (в вышеуказанном случае с 00.00 до 03.00). Некоторые временные интервалы могут перекрываться, как в случае выше.

Редактировать Я расширил свой стол до:

WeekDay     TimeBegin        TimeEnd
----------- ---------------- ----------------
3           00:00:00.0000000 01:00:00.0000000
3           01:00:00.0000000 02:00:00.0000000
3           02:30:00.0000000 04:00:00.0000000

и использовал запрос:

;with sequenced as (
    select *,rn=ROW_NUMBER() over (order by timebegin)
    from tbl
    where weekday(timebegin) = 2)
select *
from sequenced a
join sequenced b on a.rn=b.rn-1
where a.TimeEnd < b.TimeBegin

но в нем говорится, что «день недели» не является распознанным именем встроенной функции.

поэтому я изменил его на:

;with sequenced as (
    select *,rn=ROW_NUMBER() over (order by timebegin)
    from tbl
    where weekday = 2)
select *
from sequenced a
join sequenced b on a.rn=b.rn-1
where a.TimeEnd < b.TimeBegin

но затем возвращает строку, содержащую

WeekDay TimeBegin   TimeEnd
3        01:00:00.0000000   02:00:00.0000000

что на самом деле в последовательности?

спасибо Томас

Ответы [ 2 ]

1 голос
/ 26 марта 2011

, поскольку вам нужно только true или false для всей последовательности, вы можете следовать этому алгоритму:

1. sort the sequence in order of TimeBegin
2. put them in a temp table, include row_number
3. for every row starting with the second one:
    check if TimeBegin is smaller than or equal to the TimeEnd for the previous row
        if no, return false
4. return true

edit: только что понял, что это не работает в некоторых странных случаях, таких как:

TimeBegin        TimeEnd
---------------- ----------------
00:00:00.0000000 05:00:00.0000000
01:00:00.0000000 02:00:00.0000000
02:30:00.0000000 03:00:00.0000000

это все равно должно считаться последовательностью (я думаю) и возвращать true, но мой алгоритм не учитывает этот сценарий.Чтобы исправить это, при вставке во временную таблицу удалите записи, которые полностью «содержатся» в предыдущей записи (т. Е. Если TimeBegin[i] > TimeBegin[i-1] and TimeEnd[i] < TimeEnd[i-1])

0 голосов
/ 26 марта 2011

Проверяет КАЖДУЮ отдельную запись в таблице по времени и показывает ВСЕ пробелы. Если записи не отображаются, то у вас нет пробелов == данные образуют непрерывную последовательность

;with sequenced as (
    select *,rn=ROW_NUMBER() over (order by timebegin) from tbl)
select *
from sequenced a
join sequenced b on a.rn=b.rn-1
where a.TimeEnd < b.TimeBegin

Предполагая, что это расписание (только данные за неделю), и вы хотите проверить только в течение определенного дня, вы можете использовать

;with sequenced as (
    select *,rn=ROW_NUMBER() over (order by timebegin)
    from tbl
    where weekday(timebegin) = 2)
select *
from sequenced a
join sequenced b on a.rn=b.rn-1
where a.TimeEnd < b.TimeBegin

Но он охватывает только записи, которые begin on weekday 2 (Monday) и любые промежутки времени, пересекающие полночь, не рассматриваются.

Если это охватывает НЕСКОЛЬКО недель, и вам нужно проверять КАЖДЫЙ понедельник, тогда это усложняется.

;with sequenced as (
    select *,
           Date = DateDiff(d,0,timebegin),
           rn   = ROW_NUMBER() over (order by timebegin)
    from tbl
    where weekday(timebegin) = 2)
select *
from sequenced a
join sequenced b on a.rn = b.rn-1 and a.Date = b.Date
where a.TimeEnd < b.TimeBegin
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...