当周数可用时,如何从MYSQL获取一周的“开始日期”和“结束日期”?

时间:2018-02-10 19:04:12

标签: php mysql week-number

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

2 个答案:

答案 0 :(得分:0)

如何在一年中的第一个星期一添加天数?

假设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

答案 1 :(得分:0)

从周数开始,我们可以执行以下操作(大多数变量应该是直观的,但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 ...使用“上周”,因为它认为星期一是一周的第一天。