2013-01-22 15 views
5

Mam następujące zapytanie.Różnice w tygodniach między PHP a MySQL

SELECT COUNT(*), WEEK(date), YEAR(date) FROM myTable GROUP ON YEAR(date), WEEK(date) 

Say produkuje następujące wyniki

32 33 2012 
43 34 2012 
39 35 2012 
17 36 2012 

Teraz chcę uzyskać wszystkie rekordy w 39 tygodniu 35 z roku 2012. I nie, jednak chcą korzystać WEEK(date)=35 AND YEAR(date)=2012 w moim WHERE jak to nie wykorzystuje indeksów. Zamiast tego chciałbym znaleźć granice i stosować warunki warunkowe. Ja również nie chcę używać MIĘDZY, ponieważ mogą wystąpić błędy zaokrąglania.

Dlatego wypróbowałem następujące myślenie, że wszystko jest w porządku, ale nie uzyskaj 39 rekordów. Oczywiście MySQL i PHP działają inaczej niż tygodnie. Widzę, że MySQL WEEK() używa trybu 0, 2, 4 i 6, które wszystkie zwracają tydzień zaczynający się od niedzieli. Najlepiej, gdybym miał ten, który jest najczęściej używany przez ludzi, najważniejsze jest to, że jest taki sam jak dostarczony przez DateTime. Jak bym to zrobił? Dziękujemy

$w=35;$y=2012; //Given 
$w=sprintf('%02d',$w); //Make sure it is two digits 
$date = new DateTime($y.'W'.$w); 
$d1=$date->format('Y-m-d'); 
$date->add(new DateInterval('P1W')); 
$d2=$date->format('Y-m-d'); 
$sql='SELECT * FROM myTable WHERE date >= ? AND date < ?'; 
+0

MySQL obsługuje licznik tygodniowy differntly oparciu o tryb mijamy go, [patrz (data, tryb) Tydzień] (http://dev.mysql.com/doc/ refman/5.5/pl/date-and-time-functions.html # function_week), możesz także ustawić ten serwer w zmiennych systemowych. – fiz

+0

Czy otrzymujesz mniej niż 39 rekordów? Być może twój warunek WHERE powinien być "date <=?". – BellevueBob

+0

@fiz Widziałem, jak WEEK() miał różne tryby, ale nie był pewien, w jaki sposób to mogłoby pomóc. – user1032531

Odpowiedz

11

Jesteś na dobrej drodze, jeśli chodzi o sposób działania MySQL, mając różne tryby dla funkcji związanych z tygodniem, które mogą dawać różne wyniki. http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week

Jest moim zrozumieniu tryb MySQL, która jest równoważna data logiki PHP tryb 3, który jest standardem ISO data tydzień http://en.wikipedia.org/wiki/ISO_week_date

Ma tydzień rozpoczynający się w poniedziałki i numerowane 1-53 tygodni jest. Aby uzyskać wartości kompatybilne z PHP, musisz użyć WEEK(date_field, 3).

Jako alternatywne podejście znalazłem jedną rzecz, która okazała się przydatna w przypadkach, w których potrzebna jest możliwość elastycznego wyszukiwania w różnych zakresach dat lub agregacjach (Q1-Q4, H1-H2 itp.) Lub w sytuacjach, w których może być konieczne wykorzystywać różne tygodnie, niż obsługuje PHP, to używać tabeli pomocnika dat w MySQL (podobnej do tej, którą można wykorzystać jako tabelę wymiarów daty w hurtowni danych, jeśli jesteś o tym obeznany). Może dać ci wygodny stolik do przyłączenia się w celu sprawdzenia zakresów dat. Coś jak to powinno działać:

http://databobjr.blogspot.com/2012/06/create-date-dimension-table-in-mysql.html

+0

Ah ha, zbliżałem się. Sprawdzę tryb 3! – user1032531

+0

Jesteś mężczyzną Mike! Działa idealnie. – user1032531

Powiązane problemy