Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [sql]Wybieranie rekordów z zakresu timestamp
dado
post
Post #1





Grupa: Zarejestrowani
Postów: 194
Pomógł: 2
Dołączył: 12.04.2004
Skąd: Częstochowa

Ostrzeżenie: (10%)
X----


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


Ten post edytował dado 18.08.2011, 18:15:22
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
Ilware
post
Post #2





Grupa: Zarejestrowani
Postów: 248
Pomógł: 31
Dołączył: 14.12.2010
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


spróbuj zrobić subQuery do tego wybierając wszystkie wyniki mające początek mniejszy od start i koniec większy od end


--------------------
Jeżeli pomogłem kliknij "Pomógł" :)
Go to the top of the page
+Quote Post
melkorm
post
Post #3





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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 )

Ten post edytował melkorm 18.08.2011, 19:10:06


--------------------
Go to the top of the page
+Quote Post
dado
post
Post #4





Grupa: Zarejestrowani
Postów: 194
Pomógł: 2
Dołączył: 12.04.2004
Skąd: Częstochowa

Ostrzeżenie: (10%)
X----


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


Ten post edytował dado 19.08.2011, 07:58:02
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 17:27