【问题标题】:How to get week number and date of that week between two dates using MySQL如何使用 MySQL 在两个日期之间获取该周的周数和日期
【发布时间】:2019-12-03 15:17:00
【问题描述】:

我正在使用 MySQL,我有两个日期“起始日期”和“截止日期”,根据这些日期,我想获取“截止日期”和“起始日期”之间的那一周的周数和日期。

我已经尝试了以下 mysql 查询。

SELECT count(*) as count,
       CONCAT(DATE_FORMAT(DATE_ADD(FROM_DAYS(TO_DAYS(FROM_UNIXTIME(`webform_submissions`.`submitted`)) -MOD(TO_DAYS(FROM_UNIXTIME(`webform_submissions`.`submitted`)) -1, 7)),INTERVAL -6 DAY),'%M %d'), ' - ' ,DATE_FORMAT(FROM_DAYS(TO_DAYS(FROM_UNIXTIME(`webform_submissions`.`submitted`)) -MOD(TO_DAYS(FROM_UNIXTIME(`webform_submissions`.`submitted`)) -1, 7)),'%M %d')) as date , 
       CONCAT(YEAR(FROM_UNIXTIME(`webform_submissions`.`submitted`)), '/', WEEK(FROM_UNIXTIME(`webform_submissions`.`submitted`))) as week
FROM `webform_submissions` 
where `webform_submissions`.`nid` = 121 
  AND DATE_FORMAT(FROM_UNIXTIME(`webform_submissions`.`submitted`), '%Y-%m-%d') between '2019-11-01' and '2019-12-03'
GROUP BY week 
ORDER BY `webform_submissions`.`submitted` ASC

根据上述查询显示如下结果。

但它似乎给出了错误的结果,因为第 43 周位于 10 月 21 日至 27 日之间,我想在 '2019-11-01' 和 '2019-12-03' 之间得到结果。

预期的输出应该像屏幕截图一样。因为从日期“2019-11-01”开始位于 10 月 28 日至 11 月 3 日(第 44 周)之间。所以记录应该从 44 周数开始。

知道如何获得正确的周数和日期吗?

【问题讨论】:

  • 实际上week 43 介于21-27Oct 之间,您的查询结果也显示相同。为什么你认为它是错误的?
  • @ArunPalanisamy ,实际上从日期是 11 月 1 日,所以根据我的说法,第一条记录在(10 月 28 日至 11 月 3 日)为第 44 周,因为 11 月 1 日的日期介于 44 周数之间
  • 每天都有价值吗?
  • @Nick,在 '2019-11-01' 和 '2019-12-03' 之间没有某些日期有记录,有些日期没有记录。
  • 你的预期输出是什么?

标签: mysql sql


【解决方案1】:

这里有一个更易于阅读的查询版本(使用嵌套子查询,因为 MySQL 5.6 不支持 CTE)并使用 DATE_FORMAT%x/%v 格式生成 week 以匹配您的预期结果(10 月28 是第 44 周的开始)。注意我在date 的生成中添加了一个MIN,这样查询仍然可以在SQL 模式ONLY_FULL_GROUP_BY 的MySQL 5.7 中工作。

SELECT COUNT(*) AS count,
       CONCAT(DATE_FORMAT(MIN(startofweek), '%M %d'),
              ' - ',
              DATE_FORMAT(MIN(startofweek) + INTERVAL 6 DAY, '%M %d')) AS date,
       week
FROM (SELECT submitted - INTERVAL (dayofweek + 6) % 7 DAY AS startofweek,
             week
      FROM (SELECT nid, 
                   DATE(FROM_UNIXTIME(submitted)) AS submitted, 
                   DATE_FORMAT(FROM_UNIXTIME(submitted), '%w') AS dayofweek,
                   DATE_FORMAT(FROM_UNIXTIME(submitted), '%x/%v') AS week
            FROM webform_submissions
            WHERE nid = 121
              AND DATE(FROM_UNIXTIME(submitted)) BETWEEN '2019-11-01' AND '2019-12-03'
            ) AS dates
      ) AS ws
GROUP BY week

输出(用于我的示例数据)

count   date                        week
3       October 28 - November 03    2019/44
4       November 04 - November 10   2019/45

Demo on dbfiddle

【讨论】:

    【解决方案2】:

    尝试根据您的预期结果设置 WEEK() 的第二个参数。

    使用第二个参数,您可以设置模式,指定星期是从星期日还是星期一开始,周数从 0 或 1 开始,以及定义一年中第一周的规则。

    https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 2012-04-15
      • 2017-11-16
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多