【问题标题】:How to get "start date" and "end date" of a week from MYSQL when week number is available?当周数可用时,如何从 MYSQL 获取一周的“开始日期”和“结束日期”?
【发布时间】:2018-07-21 07:50:19
【问题描述】:

MySql 的 week() 函数给出从 0 到 53 的周数。

我有一个周数,我想用周数表示一周的“开始日期”和“结束日期”。 我该怎么做?

如果无法直接获取一周的“开始日期”和“结束日期”,如何从周数中获取“开始工作日”和“结束工作日”?我尝试使用以下查询获取一周的第一天(星期一):-

$currentWeek = 7;
for($w = 0; $w <= $currentWeek; $w++)
{
    $actualWeek = intval($w + 1);
    if($w < 10)
        $queryWeek = '0'.$actualWeek;
    else
        $queryWeek = $actualWeek;
    $thisYearWeek = date('Y').$queryWeek;
    $weekMondayQuery = $this->CustomerPayment->query("SELECT STR_TO_DATE('$thisYearWeek', '%X%V %W')");
}

2018 年 1 月 1 日是星期一。第一周,即。当$thisYearWeek = '201801' 时,我得到的星期一日期为 2018-01-08 而不是 2018-01-01

【问题讨论】:

标签: php mysql week-number


【解决方案1】:

在一年中的第一个星期一增加天数怎么样?

假设2018-01-01是第一周的星期一,你需要的周数是$num_week

SELECT '2018-01-01' + INTERVAL ($num_week-1)*7 DAY as start, 
       '2018-01-01' + INTERVAL $num_week*7-1 DAY as end;

第 7 周给出:

>>> SELECT '2018-01-01' + INTERVAL 42 DAY as start, 
           '2018-01-01' + INTERVAL 48 DAY as end;

start       end
2018-02-12  2018-02-18

编辑:如果一年的第一天不是星期一,则添加更正。但您的实现将取决于您如何使用 week() 函数计算周数:

>>> select '2016-01-01'+interval ($num_week-week('2016-01-01', 1))*7 - weekday('2016-01-01') day as start, 
           '2016-01-01'+interval ($num_week-week('2016-01-01', 1)+1)*7-1 - weekday('2016-01-01') day as end;

start       end
2016-02-15  2016-02-21

>>> select '2017-01-01'+interval ($num_week-week('2017-01-01', 1))*7 - weekday('2017-01-01') day as start, 
           '2017-01-01'+interval ($num_week-week('2017-01-01', 1)+1)*7-1 - weekday('2017-01-01') day as end;

start       end
2017-02-13  2017-02-19

【讨论】:

    【解决方案2】:

    从周数开始,我们可以做以下事情(大多数变量应该是直观的,但sow 是每周开始):

    SET @weeknum=42;
    SET @week=DATE_ADD('2018-01-01', INTERVAL @weeknum WEEK);
    SET @dow=DAYOFWEEK(@week)-1;
    SET @sow=DATE_SUB(@week, INTERVAL @dow DAY);
    SELECT @week, @dow, @sow;
    SELECT @sow AS startDay, DATE_ADD(@sow, INTERVAL +6 DAY) AS endDay;
    

    这告诉我们 2018 年的第 42 周从 2018 年 10 月 21 日开始,到 2018 年 10 月 27 日结束……请记住,使用这种技术,一年中的几周都是零索引的。 MySQL 返回的星期几以 1 为索引,因此在 @dow 赋值中减去。


    与此类似的 PHP 稍微简单一些:

    date('Y-m-d', strtotime('sunday last week '.date('Y-m-d', strtotime('2018-01-01 +42 weeks'))))
    

    返回:2018-10-21 ... 使用“上周”,因为它认为星期一是一周的第一天。

    【讨论】:

      猜你喜欢
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 2020-11-10
      • 1970-01-01
      相关资源
      最近更新 更多