![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 873 Pomógł: 25 Dołączył: 24.07.2005 Ostrzeżenie: (0%) ![]() ![]() |
proszę o podpowiedź merytoryczną w dwóch tematach:
1. Mam tabele ze zmianami ( w sensie zmiany w zakładzie pracy), 3 zmiany shifts shift_id shift_name shift_start shift_stop uzupełniona jest tak 1 | shift_1 | 06:00:00 | 14:00:00 1 | shift_2 | 14:00:00 | 22:00:00 1 | shift_3 | 22:00:00 | 06:00:00 na podstawie aktualnego czasu chce wyznaczyć, która jest obecnie zmiana. zapytanie w stylu
nie działa dla 3 zmiany. I w sumie musiałbym zmienić lekko te godziny aby przedziały na siebie nie nachodziły -> czyli lekko rozbudować ten helper o to by patrzył też na minuty ( zmiany musiała by się kończy np. o 13:59:00 ) załatwiam to helperem w CI
2. Różnica między czasami załóżmy, że jest 1 zmiana ( czyli między 8 a 14), załóżmy dalej stan aplikacji na 10:30. Potrzebuję wyliczyć ile upłynęło czasu między 10:30 a 8 w sekundach. Ten przypadek jeszcze nie taki zły ale czy w ten sam sposób da się wliczyć czas między np. 23 a 2.30 w nocy? Tutaj też się zmienia data i nie wiem czy to ma znaczenie dla tej kalkulacji? --- jak widać oba punkty są poniekąd zależne od siebie bo oba bazują na tabeli 'shifts' Ten post edytował john_doe 13.01.2013, 11:53:51 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 175 Pomógł: 26 Dołączył: 13.09.2007 Skąd: Gdańsk Ostrzeżenie: (0%) ![]() ![]() |
1. Osobiście w dynamicznym przykładzie dodałbym 2 dodatkowe kolumny (użyję typu TIME dla lepszej czytelności, ale mógłby to być jakiś int) i znormalizował je do północy i na nich wykonywał operacje szukania oraz pobierania różnicy w czasach. W przypadku dodawania / edycji zmiany, należałoby sprawdzić, czy ma najmniejszą wartość. Jeśli tak, pobrać różnicę między nią i północą i wpisać do dodatkowych kolumn odpowiednie wartości dla danej zmiany pomniejszone o tę różnicę. W przypadku pola TIME daty nie mogłyby zachodzić na siebie, żeby ostatnia zmiana kończyła się o 23:59:59, a nie o 00:00:00. Oczywiście wcześniejsza różnica musiałyby być znana, aby odpowiednio skorygować czas przekazywany do zapytania. Jeśli zmiany Ci się nie zmieniają w szalonym tempie i możesz w pliku konfiguracyjnym przyjąć, że pierwsza zaczyna się o 06:00:00, to uprości sprawę.
W tym wypadku miałbyś więc 2 dodatkowe kolumny: shift_start_normalized, shift_stop_normalized i dane 1 | shift_1 | 06:00:00 | 14:00:00 | 00:00:00 | 07:59:59 2 | shift_2 | 14:00:00 | 22:00:00 | 08:00:00 | 13:59:59 3 | shift_3 | 22:00:00 | 06:00:00 | 14:00:00 | 23:59:59 Do zapytania wrzucasz AKTUALNY_CZAS - RÓŻNICA, czyli Twoje zapytanie wyglądałoby tak: SELECT * FROM shifts WHERE <aktualna godzina - 6> BETWEEN shift_start_normalized AND shift_stop_normalized Zakładając, że masz tylko 3 zmiany i raczej się nie zmienia to za często, to można wykorzystać drugi sposób. 2. Pola shift_start i shift_stop są oczywiście typu TIME
Oba wyniki zwrócą pierwszą zmianę.
Wynik zwróci drugą zmianę. Przykładowe wartości '06:00:00' i '14:00:00' to aktualna godzina. Jak już sobie pobierzesz shift_start dla odpowiedniej zmiany, to później niech helper obliczy Ci różnicę czasu między aktualną porą i pobranym początkiem zmiany. Nie ma sensu zaprzęgać do tego MySQL (jeśli koniecznie chcesz, potrzebna będzie instrukcja warunkowa). W przypadku nr 1 wynik dostaniesz jako TIMEDIFF ('aktualna_godzina', shift_start) |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.06.2025 - 02:42 |