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(12, 0, 0, 1, 1, 2012); // 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
