【问题标题】:Differences in weeks between PHP and MySQLPHP 和 MySQL 之间的周差异
【发布时间】:2013-01-22 23:52:52
【问题描述】:

我有以下问题。

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

我现在想要获取 2012 年第 35 周的所有 39 条记录。但是,我不希望在 WHERE 子句中使用 WEEK(date)=35 AND YEAR(date)=2012,因为它不使用索引。相反,我希望找到边界并使用条件。我也不想使用 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 < ?';

【问题讨论】:

  • Mysql 根据你传递给它的模式不同地处理周数,see Week(date, mode),你也可以在系统变量中设置这个服务器范围。
  • 您获得的记录是否少于 39 条?也许你的 WHERE 条件应该是date &lt;= ?
  • @fiz 我确实看到 WEEK() 有不同的模式,但不确定这会有什么帮助。
  • @BobDuell 我不这么认为,因为这将包括下周的第一天。
  • @user1032531 你只需要弄清楚 PHP 使用哪种模式,然后在你的 mysql-server-variable 中设置它,Mike Brant 已经建议与答案相同。

标签: php mysql


【解决方案1】:

关于 MySQL 的工作方式,您在正确的轨道上,具有不同的模式用于与周相关的函数,可以产生不同的结果。 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week

据我了解,相当于PHP日期逻辑的MySQL模式是模式3,也就是ISO星期日期标准http://en.wikipedia.org/wiki/ISO_week_date

这有从星期一开始的周数和第 1-53 周。

所以你需要使用WEEK(date_field, 3) 来获得 PHP 兼容的值。

作为一种替代方法,我发现在您需要能够灵活查询不同日期范围或聚合(Q1-Q4、H1-H2 等)或您可能需要利用与 PHP 支持的不同周是在 MySQL 中使用日期辅助表(如果您熟悉的话,类似于在数据仓库中用作日期维度表的方法)。它可以为您提供一个方便的表格来加入以查找日期范围。像这样的东西应该可以工作:

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

【讨论】:

  • 啊哈,我快接近了。我会检查模式 3!
猜你喜欢
  • 2011-01-23
  • 2018-07-24
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2012-07-20
  • 2016-04-22
  • 2016-09-08
  • 2010-12-01
相关资源
最近更新 更多