如何使用MySQL获取两个日期之间的周数和该周的日期

如何使用MySQL获取两个日期之间的周数和该周的日期,mysql,sql,Mysql,Sql,我使用的是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_submiss

我使用的是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月03日(第44周)之间。所以记录应该从44周开始


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

根据预期结果设置week()的第二个参数

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


请参阅

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

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
输出(用于我的示例数据)


实际上
第43周
介于10月21日至27日之间,您的查询结果也显示了相同的结果。为什么你认为这是错误的?@ArunPalanisamy,实际上起始日期是11月1日,所以根据我的说法,第一个记录是(10月28日至11月3日)第44周,因为11月1日的日期在44周之间,每天都有值吗?@Nick,没有一些日期在“2019-11-01”和“2019-12-03”之间有记录,而一些日期在“2019-11-01”和“2019-12-03”之间没有记录。您的预期输出是什么?
count   date                        week
3       October 28 - November 03    2019/44
4       November 04 - November 10   2019/45