PHP a MYSQL nekonzistence práce s týdny WEEK-WTF

Created on Sat 19.May 2012by Daniel Kouba

Ke svému údivu jsem zjistil, že implementace funkce pro zjištění týdnu v roce se zásadně liší v PHP a MYSQL

Kdo by byl řekl že:

<?php
$time 
mktime(1200112012); // vytvoří datum 1.1.2012

$testDate = new Zend_date($time);        
dump($testDate->get(Zend_Date::YEAR.Zend_Date::WEEK));  // získá rok a týden přes Zend_Date
dump(date("YW",$time)); //získá rok a týden před PHP date
dump(dibi::fetchSingle("SELECT YEARWEEK( %d)",$time)); //získá rok a týden přes MYSQL funkci YEARWEEK

//vrátí 

"201252" // Zend_Date
"201252" // PHP funkce date("YW")
"201201" //MYSQL funkce YEARWEEK()

?>


Vysvětlení: PHP se snaží říct že první týden v roce 2012 začíná až 2.1.2012 (pondělí) .
Problém je že by člověk očekávám že se vrátí aspoň hodnota 2011-52, 
ovšem PHP vyhodnotí nejprve rok který je správně 2012 a až potom týden v roce což je 52 
(neřeší že tento týden začal loni)
MYSQL naproti tomu počítá jako první týden onu neděli 1.1.2012 a pondělí už počítá jako další týden.

Řešení: MYSQL funkce WEEK má druhý dobrovolný parametr, který určuje chování této funkce.
 Pokud chceme aby se chovala funkce MYSQL WEEK() obdobně jako PHP date("W"),
 je třeba použít mode 3 a ještě je potřeba dodat počáteční 0, pokud je číslo jednociferné.

<?php
date
("W",$time) == dibi::fetchSingle("SELECT LPAD( WEEK(%d,3) ,2,0) ",$time); 
?>
1
(ontami Nation