2013-01-22 118 views
5

我有以下查詢。PHP和MySQL之間的星期差異

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

說這將產生以下結果

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

我現在想獲得的所有39條記錄一週的2012年35我不知道,但希望使用WEEK(date)=35 AND YEAR(date)=2012在我的WHERE子句,因爲它不利用指標。相反,我希望找到邊界和使用條件。由於可能會發生舍入錯誤,因此我也不想使用BETWEEN。

因此,我嘗試以下想法一切都很好,但沒有得到39條記錄。很明顯,MySQL和PHP的處理與數週不同。我發現MySQL WEEK()利用了模式0,2,4和6,這些模式都返回了從星期天開始的一週。理想情況下,我會擁有最常用的人,最重要的是它與DateTime提供的一樣。我會怎麼做?謝謝

$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的處理differntly基礎上給它傳遞模式的一週計,[見周(日期模式)](http://dev.mysql.com/doc/ refman/5.5/en/date-and-time-functions.html#function_week),你也可以在系統變量中設置這個服務器範圍。 – fiz

+0

你是否少於39條記錄?也許你的WHERE條件應該是'date <=?'。 – BellevueBob

+0

@fiz我看過WEEK()有不同的模式,但不知道這將如何幫助。 – user1032531

回答

11

對於MySQL的工作原理,你有正確的方向,對於周相關函數有不同的模式,可以產生不同的結果。 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week

這是我理解的MySQL的模式,這相當於PHP的日期邏輯模式3,這是ISO週日期標準http://en.wikipedia.org/wiki/ISO_week_date

這有周開始每週一和周編號爲1-53。

所以你需要使用WEEK(date_field, 3)來獲得PHP兼容值。 ,或者你可能需要 -

作爲一種替代方法,有一件事我一直在你需要在不同的日期範圍或集合(H2等Q1〜Q4,H1)靈活查詢的能力的情況下找到得心應手利用與PHP支持不同的周,是在MySQL中使用日期幫助程序表(類似於可用作數據倉庫中日期維度表的內容,如果您熟悉的話)。它可以給你一個方便的表格,以便查找日期範圍。像這樣的東西應該工作:

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

+0

啊哈,我越來越近了。我會檢查模式3! – user1032531

+0

你是男人邁克!完美的作品。 – user1032531