【问题标题】:How DO I fetch last Week and current week如何获取上周和本周
【发布时间】:2026-01-25 07:10:01
【问题描述】:

如何从周一时间 (00:00:01) 获取上周数据并在周日时间 (23:59:59) 结束... 与本周从周一时间 (00:00:01) 到周日时间 (23:59:59) 结束的时间相同

我试过了!

$query = "SELECT users.name,count(*) as count, 
                 campaign.campaign_name, 
                 campaign.payout_cost*count(*) as totalPrice
            FROM users 
            JOIN transactions on users.uid=transactions.uid 
            JOIN campaign on campaign.campaign_id_id=transactions.campaign_id 
           WHERE uid=$uid 
             AND `date` >= DATE_SUB(DATE(NOW()), INTERVAL DAYOFWEEK(NOW())+6 DAY)   
             AND `date` <  DATE_SUB(DATE(NOW()), INTERVAL DAYOFWEEK(NOW())-1 DAY) 
           GROUP BY campaign.campaign_name_name ";

【问题讨论】:

  • 这看起来很像 PHP 与 MySQL 的结合。在这种情况下,您真的应该使用 mysqli 或 PDO 使用 Prepared Statments 和 Parametized 查询。使用直接注入变量(尤其是基于输入的情况下)构造查询会使您面临潜在的 SQL 注入攻击(SQLI 攻击)。
  • 我还在学习????但无论如何感谢您的建议

标签: mysql sql


【解决方案1】:

有几种方法可以做到...

select data from tableName
where date between date_sub(now(),INTERVAL 1 WEEK) and now();

select data FROM tableName
wherdate >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY
AND date < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY

【讨论】:

    【解决方案2】:

    您可以使用WEEK() 函数,通过添加返回给定日期的周数

    AND WEEK(date-INTERVAL 1 DAY) = WEEK(NOW()) - 1 获取从周一到周日的本周数据,

    AND WEEK(date-INTERVAL 1 DAY) = WEEK(NOW()) - 2为上周的数据

    WHERE uid=$uid之后进入WHERE条件

    比如

    $query = "SELECT c.campaign_name,
                     COUNT(*) as total_count,
                     SUM(c.payout_cost) as total_payout
                FROM transactions t
                JOIN campaign c
                  ON c.campaign_id = t.campaign_id
               WHERE uid = $uid
                 AND WEEK(date - INTERVAL 1 DAY) = WEEK(NOW()) - 1               
               GROUP BY c.campaign_name "; 
    

    并将WEEK(NOW()) - 1替换为WEEK(NOW()) - 2,也

    Demo

    【讨论】:

    • 它给了我空白 "$query = "select count(*) as count, sum(campaign.payout_cost) as total from transactions joincampaign.campaign_id = transactions.campaign_id WHERE uid=$uid AND WEEK(date-INTERVAL 1 DAY) = WEEK(NOW()) - 1 ";"
    • same here "$query = "选择campaign.campaign_name,count(*) 作为total_count,sum(campaign.payout_cost) 作为total_payout from transactions 加入campaign.campaign_id = transactions.campaign_id WHERE uid= $uid GROUP BY campaign_name AND WEEK(date-INTERVAL 1 DAY) = WEEK(NOW()) - 1 ";"
    • 我告诉过您需要添加到 WHERE 条件中,而不是添加到 GROUP BY 列表中。我已经编辑了@marcomasx,请看一下。
    • 好的,伙计,谢谢!我试过了,但仍然给我空白:(我不知道是什么问题..
    • 这是整个查询
    【解决方案3】:

    通过避免列上的week() 之类的函数,您走在了正确的轨道上——这只会弄乱优化器。另一方面,uid 参数应作为 参数 传递,而不是修改查询字符串。

    您想使用weekday() 函数,因为您希望每周从星期一开始。只是 MySQL 的一些奥秘:weekday() 在星期一返回 0,而 dayofweek() 在星期一返回 2

    因此,本周的逻辑是:

    date >= curdate() - interval weekday(curdate()) day and
    date < curdate() + interval 7 - weekday(curdate()) day
    

    上周,这将是:

    date >= curdate() - interval 7 + weekday(curdate()) day and
    date < curdate() + interval - weekday(curdate()) day
    

    注意curdate()(或current_date)返回的当前日期不包含时间部分,因此不需要date()

    【讨论】:

    • 试过这个。但不工作“选择计数(*)作为计数,总和(campaign.payout_cost)作为总交易加入campaign.campaign_id = transactions.campaign_id WHERE uid = $ uid AND'dateTime'> = curdate() - 间隔工作日( ) day and 'dateTime'
    • 什么是'datetime'?这不是正确的语法,这个答案中没有单引号。
    • 所以值必须是日期..日期时间来自列..那么那是错误的吗?
    • 但它给了我空白
    • $query = "选择campaign.campaign_name,count(*) 作为total_count,sum(campaign.payout_cost) 作为total_payout 从交易加入campaign.campaign_id = transactions.campaign_id WHERE uid=$uid AND date >= curdate() - 间隔 weekday(curdate()) 日期和日期
    最近更新 更多