![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 243 Pomógł: 0 Dołączył: 30.11.2003 Ostrzeżenie: (0%) ![]() ![]() |
W tabeli "Zdarzenia" mam dwa pola typu DATETIME: DataB i DataC.
Jest następująca reguła: - jeśli DataB jest przed godziną 13:00, to DataC musi być datą z tego samego dnia, - jeśli DataB jest po 13:00, to: - jeśli DataB jest piątkowa, to DataC musi być datą z najbliższego poniedziałku do godziny 12:00 (szerzej - najbliższego dnia roboczego, ale nie będę się czepiał...), - w przeciwnym wypadku DataC musi być datą z dnia następnego w stosunku do DataB, do godziny 12:00. Jak wybrać wszystkie zdarzenia zapisane w bazie, nie spełniające tej reguły? MySQL 4.0.18 (brak podselectów). Pozdrawiam, Krzysiek |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 255 Pomógł: 0 Dołączył: 22.04.2004 Skąd: Żoliborz Ostrzeżenie: (0%) ![]() ![]() |
Pozdrawiam, Bartek Ten post edytował popbart 12.11.2004, 23:13:11 -------------------- Visual Basic - kto by pomyślał :)
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 243 Pomógł: 0 Dołączył: 30.11.2003 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za zainteresowanie, to dosyć ciekawe rozwiązanie...
Ale w MySQL nie ma funkcji TIME ani DATE. Można je zamienić odpowiednio HOUR i DATE_FORMAT, co zresztą uczyniłem. Nie da się również w klauzuli WHERE użyć aliasu "warunek"; jedyne co mi przyszło do głowy to zamiana WHERE na HAVING. Wyszło mi coś takiego:
Tyle że to zapytanie jest skrajnie nieoptymalne - skanuje całą tabelę i nie wiedzieć czemu nie korzysta z indeksów, chociaż są wszędzie, gdzie być powinny. Zapewne to wina użycia HAVING zamiast WHERE. Poza tym jeśli chcę dodać kolejny warunek, np. wybór zdarzeń od ... do ..., to muszę umieścić kolejnego IF'a zamiast prostego WHERE DataB BETWEEN ... AND ... , prawda? Reasumując - nie da się jakoś prościej? Pozdrawiam, Krzysiek |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 255 Pomógł: 0 Dołączył: 22.04.2004 Skąd: Żoliborz Ostrzeżenie: (0%) ![]() ![]() |
Co do time i date to zapomniałem dodać że są one dostępne dopiero od wersji 4.1.1.
Z tym having masz rację. Warunek where możesz spokojnie wstawić przed klauzulą having i tam dawać jakieś inne warunki typu between. Cytat Tyle że to zapytanie jest skrajnie nieoptymalne - skanuje całą tabelę i nie wiedzieć czemu nie korzysta z indeksów, chociaż są wszędzie, gdzie być powinny. Zapewne to wina użycia HAVING zamiast WHERE. A masz ustawione indeksy na pola DataB i DataC ? -------------------- Visual Basic - kto by pomyślał :)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 19.08.2025 - 20:30 |