【问题标题】:Insert records for the rest of the year starting on current week从本周开始插入今年剩余时间的记录
【发布时间】:2021-06-26 15:31:21
【问题描述】:

我正在尝试在今年剩余时间插入相同的记录。

由于我们目前处于 2021 年第 13 周,总共还有 40 周(包括第 13 周)。

使用下面的代码,我可以得到当前的年份和星期:

define('NL', "\n");

$ddate = date("Y/m/d");
$date = new DateTime($ddate);
$currentyear = $date->format("Y");
$week = $date->format("W");

echo "Current Year: $currentyear", NL;
echo "Weeknumber: $week", NL;

上面会输出以下内容:

Current Year: 2021
Weeknumber: 13

这是我尝试使用 WHILE 循环创建具有不同周数的 INSERT 查询:

$year  = $currentyear;

$firstDayOfYear = mktime(0, 0, 0, 1, 1, $year);
$nextSunday     = strtotime('monday', $firstDayOfYear);

while (date('Y', $nextSunday) == $year) {
  $insert = "INSERT INTO history (`WEEK`, `YEAR`, `ADDDATE`, `USERNAME`) VALUES ($nextSunday, $year', NOW(), 'jbeasley')";
  
  echo $insert, NL;

  $nextSunday = strtotime('+1 week', $nextSunday);
}

这是输出的样子:

 INSERT INTO history (`WEEK`, `YEAR`, `ADDDATE`, `USERNAME`) VALUES (1, '2021', NOW(), 'jbeasley')
 INSERT INTO history (`WEEK`, `YEAR`, `ADDDATE`, `USERNAME`) VALUES (2, '2021', NOW(), 'jbeasley')
 INSERT INTO history (`WEEK`, `YEAR`, `ADDDATE`, `USERNAME`) VALUES (3, '2021', NOW(), 'jbeasley')
 // and so on up to 52 (there are 52 weeks in 2021)

这在很大程度上是有效的,但这也是我卡住的地方。

我不确定如何让 INSERT 在本周开始,而忽略之前的所有星期。在这种情况下,由于我们目前处于第 13 周,因此第一个 INSERT 应该从第 13 周开始,然后是剩余的几周,如下所示:

INSERT INTO history (`WEEK`, `YEAR`, `ADDDATE`, `USERNAME`) VALUES (13, '2021', NOW(), 'jbeasley')
INSERT INTO history (`WEEK`, `YEAR`, `ADDDATE`, `USERNAME`) VALUES (14, '2021', NOW(), 'jbeasley')
INSERT INTO history (`WEEK`, `YEAR`, `ADDDATE`, `USERNAME`) VALUES (15, '2021', NOW(), 'jbeasley')
// and so on until the final week

【问题讨论】:

  • 您已经知道如何获得一周:$week = $date->format("W");。您可以在循环中添加一个简单的 if 条件,如果一周小于您想要的,则跳过插入。
  • 这似乎是一个徒劳的练习。你为什么想做这个?通常,“历史”是过去,而不是未来。为什么不只创建具有实际意义的数据?
  • @KIKOSoftware - “历史”只是表的名称。从技术上讲,它不是存储历史记录。
  • 语义在开发中也很重要。将不包含历史记录的表命名为 history 只会给系统增加混乱。
  • @El_Vanja - 明白了。我会记住这一点。我还在测试你的建议。很快就会恢复。

标签: php mysql while-loop insert


【解决方案1】:

根据 El_Vanja 的建议,我更新了 WHILE 循环以包含一个 IF/ELSE 来检查当前周是否大于:

while (date('Y', $nextSunday) == $year) {
  if($week > date('W', $nextSunday)){
    echo "skip this week " . date('W', $nextSunday), NL;
    $nextSunday = strtotime('+1 week', $nextSunday);
  }
  else{
    $insert = "INSERT INTO history (`WEEK`, `YEAR`, `ADDDATE`, `USERNAME`) VALUES ($nextSunday, $year, NOW(), 'jbeasley')";

    echo $insert, NL;

    echo date('W', $nextSunday), NL;
    $nextSunday = strtotime('+1 week', $nextSunday);
  }
}

使用上述方法,循环将跳过过去几周,仅在当前一周开始创建查询。

【讨论】:

  • @Syscall - 拥有第二双眼睛总是很高兴。谢谢你。更新了答案。
猜你喜欢
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
相关资源
最近更新 更多