sql >> Databáze >  >> RDS >> Mysql

Týden v roce pro týdny začínající sobotou

Měl jsem podobný problém:Potřeboval jsem vypočítat čísla týdnů na základě následujících pravidel:

  • Týden začíná v pátek
  • Zbývající dny v roce (všechny dny po posledním pátku v roce, které nedokončí týden) by se měly počítat do prvního týdne příštího roku.

Například:

  • 27/12/2012 (čtvrtek) by měl být 52. týden roku 2012
  • 28/12/2012 (pátek) by měl být 1. týden roku 2013
  • 1. týden 2013 trvá od 28. 12. 2012 do 1. 3. 2013

Učinil jsem toto prohlášení, které vypočítává ROK i ČÍSLO TÝDNE na základě těchto pravidel, která můžete snadno přizpůsobit své situaci:

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));

Záludná část je právě tento výraz:

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

Zbytek (klauzule If) slouží pouze k přizpůsobení výsledku výrazu tak, aby byl rok+1 a týden =1 v 53. týdnu.

Pokusím se ten výraz co nejlépe vysvětlit. Následující výraz vám dá číslo týdne čistě jednoduše (den v roce dělený 7 dny v týdnu zaokrouhlený nahoru):

ceil(( dayofyear(current_date))/7)

Ale teď chcete, aby to začalo v pátek (nebo kterýkoli jiný den). Chcete-li to provést, musíte k aktuálnímu dni přidat dny prvního týdne, které byly součástí předchozího roku (jako by váš aktuální skutečně začal o několik dní dříve, protože váš první týden obsahuje dny z předchozího roku). výraz vypočítá tento posun na základě dne v týdnu 1. ledna:

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

Posun je rozdíl mezi 7 a číslem dne v týdnu, kterým má týden začínat:

  • 0 na sobotu
  • 1 na pátek
  • 2 na čtvrtek
  • 3 na středu...

Nyní jej tedy stačí přidat k předchozímu, čímž vznikne výše zmíněný výraz, který vypočítá čísla týdnů počínaje kterýmkoli dnem v týdnu a za předpokladu, že týden 1 začíná předchozím rokem:

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

Pak jsem jen přidal IF, který změní týden 53 na týden 1, a další pro přidání 1 k roku, pokud je to týden 53.



  1. převést řetězec na datum php

  2. Nejčistší způsob, jak vytvořit řetězec SQL v Javě

  3. Jak zřetězit řetězce v PostgreSQL

  4. Změňte tabulku MySQL a přidejte komentáře ke sloupcům