Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sql]Wybieranie rekordów z zakresu timestamp
Forum PHP.pl > Forum > Bazy danych > MySQL
dado
Witam. Męczę sie już kilka dni z pewnym zapytaniem.
Robię kalendarz wydarzeń i mam problem z wybieraniem wydarzeń do kalendarza. Zapytanie ma wybrać wszystkie zdarzenia które zaczynają się, trwają lub kończą w podanym czasie widełek daty. Niestety zapytanie wybiera tylko te rekordy które albo zaczynają się albo kończą w podanych widełkach ale nie wybiera tych które trwają w podanych widełkach choć mogą się zaczynać wcześniej lub kończyć później

  1. SELECT
  2. a.task_id,
  3. a.task_name,
  4. a.task_start,
  5. a.task_end,
  6. a.task_status,
  7. a.user_id,
  8. b.user_name,
  9. b.user_type_id,
  10. c.task_id AS task_invite
  11. FROM
  12. cal_task a
  13. JOIN
  14. cal_users b ON(a.user_id=b.user_id)
  15. LEFT JOIN
  16. cal_task_merge_users c ON(a.task_id = c.task_id)
  17. WHERE(
  18. a.task_start_date BETWEEN '".date("Y-m-d H:i:s", $start)."' AND '".date("Y-m-d H:i:s", $end)."'
  19. )
  20. GROUP BY
  21. a.task_id
  22. ORDER BY
  23. a.task_start ASC
  24. ;


struktura tabeli głównej
  1. Pełny tekst task_id user_id enterprise_id task_status task_start task_end task_start_date task_end_date task_name task_descr task_note task_buynote
Ilware
spróbuj zrobić subQuery do tego wybierając wszystkie wyniki mające początek mniejszy od start i koniec większy od end
melkorm
Cytat
spróbuj zrobić subQuery do tego wybierając wszystkie wyniki mające początek mniejszy od start i koniec większy od end


Bzdura.


Musisz mieć 3 warunki:
1. Data startu pomiędzy Początek i Koniec (czyli koniec może być za datą końcową)
2. Data zakończenia pomiędzy początek a koniec (czyli początek może być przed datą początkową)
3. Data startu mniejsza niż Początek i data zakończenia większa niż koniec (dla tych zadań które obejmują swoim zasięgiem cały zakres)

Może jest lepsze rozwiązanie, ale to jest to co mi na tą chwilę przychodzi na myśl wink.gif

@edit: oczywiście OR'y a dla ostatniego OR ( if1 AND if2 )
dado
czyli już sam blok WHERE czy to będzie tak?
  1. WHERE
  2. (
  3. a.task_start BETWEEN $start AND $end
  4. )
  5. OR
  6. (
  7. a.task_end BETWEEN $start AND $end
  8. )
  9. OR
  10. (
  11. a.task_start < $start
  12. AND
  13. a.task_end > $end
  14. )






Oki zadziałało wyśmienicie dodałem jeszcze w select klauzule pozwalające stwierdzić z którego ora zapytanie skorzystało przy danym rekordzie, wklejam dla tych co kiedys będą tracić godziny przy tym
  1. SELECT
  2. a.task_id,
  3. a.task_name,
  4. a.task_start,
  5. a.task_end,
  6. a.task_status,
  7. a.user_id,
  8. b.user_name,
  9. b.user_type_id,
  10. c.task_id AS task_invite,
  11. IF(
  12. (a.task_start_date BETWEEN '".date("Y-m-d H:i:s", $start)."' AND '".date("Y-m-d H:i:s", $end)."'), 1, 0
  13. ) AS w1,
  14. IF(
  15. (a.task_end_date BETWEEN '".date("Y-m-d H:i:s", $start)."' AND '".date("Y-m-d H:i:s", $end)."'), 1, 0
  16. ) AS w2,
  17. IF(
  18. (a.task_start < ".$start." AND a.task_end > ".$end."), 1, 0
  19. ) AS w3
  20. FROM
  21. cal_task a
  22. JOIN
  23. cal_users b ON(a.user_id=b.user_id)
  24. LEFT JOIN
  25. cal_task_merge_users c ON(a.task_id = c.task_id)
  26. WHERE(
  27. a.task_start_date BETWEEN '".date("Y-m-d H:i:s", $start)."' AND '".date("Y-m-d H:i:s", $end)."'
  28. )
  29. OR(
  30. a.task_end_date BETWEEN '".date("Y-m-d H:i:s", $start)."' AND '".date("Y-m-d H:i:s", $end)."'
  31. )
  32. OR(
  33. a.task_start < ".$start."
  34. AND
  35. a.task_end > ".$end."
  36. )
  37. AND(
  38. a.user_id = '".session::get('KEY')."'
  39. OR
  40. c.user_id = '".session::get('KEY')."'
  41. OR
  42. b.user_type_id > '".session::get('type_id')."'
  43. )
  44. GROUP BY
  45. a.task_id
  46. ORDER BY
  47. a.task_start ASC
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.