Wyświetlanie poszczególnych miesięcy z zakresu dat T-SQL.

0

Hej, mam następujący problem. Mam dwie kolumny DateFrom oraz DateTo. Załóżmy, że pierwszy wiersz to zakres:

DateFrom | DateTo
2017-06-01 0000.000 | 2017-09-30 0000.000

Czyli od 1 czerwca 2017 roku do 30 września 2017. Jak widać powyższy zakres mieści 4 miesiące (czerwiec, lipiec, sierpień, wrzesień). Zapytanie powinno mi zwrócić wynik wyświetlający poszczególne miesiące znajdujące się w tym zakresie tzn.:

Kolumna1
2017-06
2017-07
2017-08
2017-09

Bardzo proszę o pomoc.

0

Przecież to nie jest żadne zapytanie. Zapytanie polega na odczycie danych z bazy. W bazie nie masz danych za poszczególne miesiące (tylko łącznie za 4 miesiące), nie możesz zrobić takiego zapytania.

Możesz napisać funkcję rozbijNaMiesiace(dataOd, dataDo), która zwróci resultset w postaci wierszy miesiąc po miesiącu (x wierszy, w każdym 2 daty). Ale chyba nie o to chodzi. Funkcje przetwarzające dane raczej pisze się w aplikacji, nie w bazie danych.

Co innego, gdybyś w bazie danych miał dane z dokładnością do dnia - i chciałbyś to podzielić na miesiące. To by miało sens i chętnie bym się dowiedział jak to elegancko robić.

0

Jak najbardziej wykonalne, ja niestety nie jestem w stanie pomóc, lecz na angielskich forach padały już takie pytania i odpowiedzi -> szukaj po angielsku a znajdziesz ;)

0

Doprecyzowuję:
Oczywiście tabela posiada więcej niż same daty. Podałem daty, ponieważ miałem nadzieję, że istnieje sama funkcja systemowa, która to umożliwi tylko za pomocą samych dat.
Tabela kolumny:
ID,Numer umowy, data podpisania umowy, Data trwania umowy od, Data trwania umowy do, Typ kontraktu. Kolumna "Data trwania umowy do" może zawierać NULL co oznacza, że jest bezterminowa.
Muszę wyświetlić info:
Gdy obiekt posiada aktualną umowę w danym miesiącu (nawet chociażby przez jeden dzień) wyświetl jego status - Statusy i Obiekty to osobna tabela.

1

To zmienia postać rzeczy. Chcesz dla danego miesiąca wyświetlić wszystkie wiersze, które zawierają ten miesiąc. To jest do zrobienia. Coś w stylu:

select * from dane where pocz >= 2018-02-01 and kon <= 2018-02-28

To jest rozwiązanie typu generic, które zadziała na każdej bazie, po odpowiednim sformatowaniu daty. MSSQL może mieć jakąś lepszą funkcję, która mogłaby się nazywać is_overlapped, ale tego nie wiem. W zasadzie ja bym już nie szukał nic lepszego. Takie rozwiązanie jest czytelne. O ile dobrze zrozumiałem zadanie.

Gdybyś chciał więcej okresów, to można to zapytanie zwielokrotnić na kilka okresów miesięcznych. Na przykład robisz zapytanie styczeń, luty, marzec i łączysz przez union.

0

Hmm dzięki za odpowiedź ale jednak raczej nie o to chodzi.
Podaję np parametry daty (po napisaniu procedury użytkownik będzie podawał parametry):
Data od: 2017-01-01
Data do: 2017-05-01
Jak widać w skład powyższego zakresu dat wchodzą miesiące: styczeń, luty, marzec, kwiecień, maj. Ja muszę wyświetlić ten zakres w ten sposób:
MiesiącUmowy | Status ( tę wartość biorę już z innej tabeli)
2017-01 |
2017-02 |
2017-03 |
2017-04 |
2017-05 |

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