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

Wyświetlanie poszczególnych miesięcy z zakresu dat T-SQL.
PA
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:33
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 00:00:00.000 | 2017-09-30 00:00:00.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.

jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
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ć.


Przeważnie ignoruję niezarejestrowanych użytkowników.
PA
Może nie precyzyjnie to ująłem. Zapytanie - miałem na myśli po prostu metodę jak to najlepiej zrobić bo kombinuję już dość długo i nie mogę uzyskać zamierzonego efektu. Próbowałem z funkcjami daty/ czasu
jarekczek
To doprecyzuj swój problem, bo dla mnie jest to niewykonalne. Pokaż przykład danych i oczekiwany efekt "zapytania". Tylko nie w komentarzu, w kolejnym poście.
jarekczek
Może ja też doprecyzuję - wydaje mi się, że w tych danych masz coś więcej niż tylko daty. Dziwna to tabela, w której są same daty.
R1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:13
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 ;)

jarekczek
Człowieku, nie spamuj.
PA
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:33
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.

jarekczek
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Siemianowice Śląskie
  • Postów:500
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:

Kopiuj
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.


Przeważnie ignoruję niezarejestrowanych użytkowników.
PA
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:33
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 |

edytowany 1x, ostatnio: pawlag
jarekczek
No to przecież napisałem, żeby użyć union. Obstawiam, że jednym selectem tego nie zrobisz. Albo procedura albo generowanie sql z union.
R1
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:13
2
jarekczek
...albo triki mssqlowe. Fajne. Do tego jeszcze dołożyć jakieś złączenie i powinno działać.
PA
O to mniej więcej chodziło!! Dzięki, dam znać jak uzyskam efekt finalny
Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:3 dni
  • Postów:2792
1

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.