[MSSQL] Odbicie lustrzane interwału dat

0

Witam wszystkich.

Przyszło mi napisać zapytanie, korzystające z tabeli zawierającej dwie kolumny informujące o umówionych spotkaniach. Przykładowe dane:

data_start                    data_stop
2009-03-01 08:20:00.000       2009-03-01 09:20:00.000
2009-03-15 13:55:00.050       2009-03-15 15:17:23.001
...
[itd]

Uogólniając kolumna data_start zawiera datę rozpoczęcia pewnego zadania przydzielonego pracownikowi a kolumna data_stop datę zakończenia zadania (planowaną, szacowaną - nie zdarza się sytuacja w której pracownik przekracza ten czas). Data_start i data_stop tworzy pewnego rodzaju interwał. Muszę podać informację o interwałach, w których pracownik (w przeciągu kolejnych 30 dni od =>NOW()) nie jest zajęty. Nie mam zielonego pojęcia jak takie zapytanie mogłoby wyglądać.

Dla potrzeb pytania na forum uprościłem znacząco budowę tabeli.

0

Chyba żarty sobie robisz... Wyświetlasz kolejne data_stop - data_start i już...

0

@AdamPL, jesteś pewien? Raczej data_start(z kolejnego rekordu)-data_stop. Słabo znam SQL, ale sądzę, że jeśli odpowiedź trzeba uzyskać zapytaniem to bez procedury zapamiętanej się nie obędzie.

0

W jakiej postaci ma być taka informacja? W ilości godzin, minut, czy może mają to być okresy, np:

9:20 - 13:00?

0

Założenie jest takie, że pracownik może wykonywać zadanie np. kilka dni. Dane mają być w postaci:

WOLNY OD - WOLNY DO

np: 2009-01-03 1300 - 2009-02-01 0800

AdamPL chyba żarty sobie robisz... Nie zrozumiałeś problemu. A może i mój błąd bo nie napisałem, że pracownik może mieć kilka spotkać w ciągu dnia a nawet kilka w ciągu godziny.

0

Coś w ten deseń: (to nie jest gotowe rozwiązanie)

declare @t table (id int not null identity(1, 1), id_user int not null, data_start datetime not null, data_stop datetime not null)
insert into @t select 1, '20090301 08:20', '20090301 09:20' union select 1, '20090315 13:55', '20090315 15:17:23'

select * from @t
select id_user, (select top 1 data_stop from @t where id_user=t.id_user and data_stop<t.data_start), data_start from @t t 

T-SQL

0

AdamPL chyba żarty sobie robisz... Nie zrozumiałeś problemu. A może i mój błąd bo nie napisałem, że pracownik może mieć kilka spotkać w ciągu dnia a nawet kilka w ciągu godziny.

Nie robię sobie żartów, z resztą Marcin.Miga zrobił w swoim przykładzie dokładnie to co mówiłem. Wyświetla kolejne top 1 data_stop mniejszą od data_start i już... te zapytanie jest trywialne.

0

To nie tak.
Wyświetlasz kolejne data_start - aktualne data_stop.

To jest przedział, gdzie pracownik jest wolny.

Czyli bierzesz data_stop z pierwszego wiersza, data_start z drugiego wiersza i robisz insert do jakiejś tabeli, z której później odczytujesz. Tak to widzę.

Oczywiście odczytujesz w takiej postaci:

data_stop - data_start, co będzie oznaczało: wolny od - do.

0

Juhas idealnie zrozumiał problem i bardzo dobrze go opisał. Problem uważam za rozwiązany. Pozdrawiam.

0

Sorry, a mój skrypt to co niby robi? Jedyna różnica, to to że nie wstawia do nowej tabeli...

0
Juhas napisał(a)

Czyli bierzesz data_stop z pierwszego wiersza, data_start z drugiego wiersza

AdamPL napisał(a)

Wyświetlasz kolejne data_stop - data_start i już...

Powiedz mi czym różni się moja wypowiedź od Twojej Juhas?! Dokładnie to napisałem, a Marcin.Miga nawet napisał kod... Parodia jakaś i jeszcze autor wątku mi wmawia, że nie zrozumiałem LOL.

0
AdamPL napisał(a)
Juhas napisał(a)

Czyli bierzesz data_stop z pierwszego wiersza, data_start z drugiego wiersza

AdamPL napisał(a)

Wyświetlasz kolejne data_stop - data_start i już...

Powiedz mi czym różni się moja wypowiedź od Twojej Juhas?! Dokładnie to napisałem, a Marcin.Miga nawet napisał kod... Parodia jakaś i jeszcze autor wątku mi wmawia, że nie zrozumiałem LOL.

Mam widocznie z autorem posta bardzo podobny umysł, bo szczerze powiem, że Ciebie też zrozumiałem inaczej niż zamierzałeś ;>

0

Te zapytanie jest tak banalne, że nie wchodziłem w szczegóły i nie wyjaśniłem precyzyjnie o co chodzi. Powinniście się domyślić ;>

1 użytkowników online, w tym zalogowanych: 0, gości: 1