Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Tydzień roku dla tygodni zaczynających się od soboty

Miałem podobny problem:musiałem obliczyć numery tygodni w oparciu o następujące zasady:

  • Tydzień zaczyna się w piątek
  • Pozostałe dni roku (wszystkie dni po ostatnim piątku roku, które nie kończą tygodnia) powinny być liczone w pierwszym tygodniu następnego roku.

Na przykład:

  • 27.12.2012 (czwartek) powinien przypadać na 52. tydzień 2012 r.
  • 28.12.2012 (piątek) powinien być pierwszym tygodniem 2013
  • Tydzień 1 2013 trwa od 28.12.2012 do 01.03.2013

Złożyłem to oświadczenie, które oblicza zarówno ROK, jak i NUMER TYGODNIA na podstawie tych zasad, które możesz łatwo dostosować do swoich okoliczności:

SELECT IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, YEAR(current_date)+1, YEAR(current_date)), 
        IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, 1, ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7));

Trudną częścią jest tylko to wyrażenie:

ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)

Pozostałe (klauzule If) służą tylko dostosowaniu wyniku wyrażenia, aby rok + 1 i tydzień =1 w 53. tygodniu.

Postaram się jak najlepiej wyjaśnić wyrażenie. Poniższe wyrażenie daje prosty numer tygodnia (dzień w roku podzielony przez 7 dni w tygodniu zaokrąglony w górę):

ceil(( dayofyear(current_date))/7)

Ale teraz chcesz, aby zaczęło się w piątek (lub w inny dzień). Aby to zrobić, musisz dodać do bieżącego dnia dni pierwszego tygodnia, które były częścią poprzedniego roku (to tak, jakby twój prąd faktycznie zaczął się kilka dni wcześniej, ponieważ pierwszy tydzień zawiera dni z poprzedniego roku). wyrażenie oblicza to przesunięcie na podstawie dnia tygodnia w dniu 1 stycznia:

dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET

Przesunięcie to różnica między 7 a numerem dnia tygodnia, od którego ma się zaczynać tydzień:

  • 0 na sobotę
  • 1 na piątek
  • 2 na czwartek
  • 3 na środę...

Więc teraz wystarczy dodać go do poprzedniego, w wyniku czego otrzymamy wyżej wymienione wyrażenie, które oblicza numery tygodni rozpoczynające się w dowolnym dniu tygodnia i zakładając, że tydzień 1 zaczyna się w poprzednim roku:

ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)

Następnie dodałem tylko JEŻELI, który zmienia tydzień 53 w tydzień 1 i kolejny, aby dodać 1 do roku, jeśli jest to tydzień 53.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Debugowanie wyzwalaczy MySQL

  2. Aktualizacja wyzwalacza MySQL z wyborem z innej tabeli

  3. Połącz dwie kolumny z dwóch tabel w jedną

  4. MySQL 'Obcięta niepoprawna wartość INTEGER'

  5. Uzyskaj wiek osoby w MySQL