php - 返回给定周的所有记录

标签 php mysql

我希望返回 2012 年第 5 周的所有记录。例如,以下查询将提供正确的记录,但是效率非常低,因为必须为每一行计算 WEEK() 和 YEAR(),并且索引可能会丢失不被利用。我希望应该使用 BETWEEN ,但我不确定如何这样做。我还需要在给定的月份和季度做类似的事情,并且理想情况下可以使用类似的解决方案。如果需要的话,我可以用 PHP 来补充 SQL。谢谢

SELECT * FROM myTable WHERE WEEK(dateColumn)=5 AND YEAR(dateColumn)=2012;

编辑 - 以下内容已添加到补充评论中

***测试数据 ***

SELECT * FROM projects_sell WHERE award_date BETWEEN '2012-04-01' AND '2012-04-08'

0.55236601829529

SELECT * FROM projects_sell WHERE YEAR(award_date)=2012 AND WEEK(award_date)=5

0.52925586700439

SELECT * FROM projects_sell WHERE award_date > STR_TO_DATE('1,5,2012', '%w,%v,%Y') AND award_date < STR_TO_DATE('0,5,2012', '%w,%v,%Y')

0.69798302650452

***测试脚本 ***

//$sql ="SELECT * FROM projects_sell WHERE award_date BETWEEN '2012-04-01' AND '2012-04-08'";
//$sql ="SELECT * FROM projects_sell WHERE YEAR(award_date)=2012 AND WEEK(award_date)=5";
$sql ="SELECT * FROM projects_sell WHERE award_date > STR_TO_DATE('1,5,2012', '%w,%v,%Y') AND award_date < STR_TO_DATE('0,5,2012', '%w,%v,%Y')";

$current_time=microtime(true);
for ($i=1; $i<=1000; $i++)
{
    $stmt = db::db()->query($sql);
    $rs = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
echo($sql.'<br>'.(microtime(true)-$current_time).'<br>');

最佳答案

使用STR_TO_DATE您可以创建一周的第一天和最后一天。然后使用 BETWEEN 或日期算术来查找日期:

WHERE dateColumn > STR_TO_DATE('1,5,2012', '%w,%v,%Y') 
               AND dateColumn < STR_TO_DATE('0,5,2012', '%w,%v,%Y')

关于php - 返回给定周的所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14366671/

相关文章:

php - 防止 nicEdit 创建外部标签

php - 使用 Symfony Autowiring 扩展类的正确方法

php - PHP5支持unicode&多语言的策略

php - 如何建立简单的评论和5星评级系统?

php - 在二维数组中找到最近的邻居点

mysql - 具有多个表连接的每个组的前 N ​​个

php - 正则表达式从 [shortcode] 中提取变量

javascript - 可以暂停 PHP 脚本,使用 HTML/JS 获取 GPS 位置,然后恢复 PHP 吗?

php - 无法从 php 更新 mysql 中的数据

php - 如何在php中输出MySQL EXPLAIN数据?