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 。
答案 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
...使用“上周”,因为它认为星期一是一周的第一天。