carbon 时间转化

需求:

1、按周统计给定时间的数据
2、每周第一天从周日开始算起(重点)

实现

  • sql语句
    SELECT
      DATE_FORMAT( order_time, '%Y%u' ) weeks,
      COUNT(*) AS total 
    FROM
      `orders` 
    WHERE
      `order_time` BETWEEN '2023-12-31 00:00:00' 
      AND '2024-01-06 23:59:59'  
    GROUP BY
      weeks
  • php 代码 截取时间处理部分
    # $item->weeks = 202352
    [$year, $week] = str_split($item->weeks, 4);
    Carbon::setWeekStartsAt(Carbon::SUNDAY);
    Carbon::setWeekEndsAt(Carbon::SATURDAY);
    $weekStartDay = Carbon::now()->setISODate($year, $week)->startOfWeek();
    $weekEndDay = $startDay->copy()->endOfWeek();

问题

可以看出来我mysql 查询时一周是按这从周一到周日统计的,但是用carbon进行处理的时候是却是周日到周六 当出现临界值的时候 比如2023.12.31-2024.1.6 数据库按周日到周日算 会统计两周结果出来分别是2023-12.25 - 2023.12.31 和 2024.01.01 - 2024.01.06, 实际我按周日进行一周计算只需要 2023.12-31 - 2024.01.06 就可以了, 这个sql该怎么改呢

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

google 了一下 找到类似文章的解决办法 cloud.tencent.com/developer/articl...

使用了chatgpt-4 让他用YEARWEEK 给我写sql

最终的sql为

SELECT
    YEARWEEK(DATE_ADD(order_time, INTERVAL 1 DAY), 3) AS week,
    COUNT(*) AS total
FROM
    orders
GROUP BY
    week
ORDER BY
    week
1年前 评论
周小云 1年前
晏南风 (作者) (楼主) 1年前
周小云 1年前
讨论数量: 12

DATE_FORMAT(order_time, '%X%V')

1年前 评论
晏南风 (楼主) 1年前
Trace92 1年前
周小云 (作者) 1年前

试试这个行不行

SELECT
  DATE_FORMAT( order_time, '%Y%U' ) weeks,
  COUNT(*) AS total 
FROM
  `orders` 
WHERE
  `order_time` BETWEEN '2023-12-31 00:00:00' 
  AND '2024-01-06 23:59:59'  
GROUP BY
  weeks
1年前 评论
晏南风 (楼主) 1年前

google 了一下 找到类似文章的解决办法 cloud.tencent.com/developer/articl...

使用了chatgpt-4 让他用YEARWEEK 给我写sql

最终的sql为

SELECT
    YEARWEEK(DATE_ADD(order_time, INTERVAL 1 DAY), 3) AS week,
    COUNT(*) AS total
FROM
    orders
GROUP BY
    week
ORDER BY
    week
1年前 评论
周小云 1年前
晏南风 (作者) (楼主) 1年前
周小云 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!