2013-01-22 93 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