0

我已经有这个问题大约一个月了。我为我的公司建立了一个文案管理系统,以帮助减轻管理如此大项目的压力。系统按每周完成的项目向作者支付费用。由于工资限制,他们的支付期为周四上午 12:00 至周三上午 11:59。在作家的仪表板上,我显示了他们上周支付期间的总数,然后是他们本周所写的当前金额。

我正在使用 strtotime() 这样做:

$currentdate = date("Y-m-d");
$lastweekstart = date('Y-m-d', strtotime('2 thursdays ago'));
$lastweekend = date('Y-m-d', strtotime('last wednesday'));
$thisweekstart = date('Y-m-d', strtotime('last thursday'));

然后我从数据库中检索上周的记录:

mysqli_query($con, "SELECT * FROM table_name WHERE username='$username' AND date BETWEEN '$lastweekstart' AND '$lastweekend'");

和本周:

mysqli_query($con, "SELECT * FROM table_name WHERE username='$username' AND date BETWEEN '$thisweekstart' AND '$date'");

这在一周的大部分时间里都很有效,但在星期四它变得有点疯狂。所以我开始尝试更改 $thisweekstart 和 $lastweekstart 的日期,这些日期一直有效到星期五,然后它又变得疯狂了。所以,基本上,下面是我当前的代码,除了星期五之外每天都可以使用。

$lastweekstart = date('Y-m-d', strtotime('2 thursdays ago'));
$lastweekend = date('Y-m-d', strtotime('last wednesday'));
$thisweekstart = date('Y-m-d', strtotime('last thursday'));
if ($date == date('Y-m-d', strtotime('thursday'))) {
    $thisweekstart = $date;
    $lastweekstart = date('Y-m-d', strtotime('last thursday'));
} else {
    if ($date == date('Y-m-d', strtotime('friday'))) {
        $lastweekstart = date('Y-m-d', mktime(0,0,0,date("m"),date("d")-8,date("Y")));  
    }
}

// counts descriptions written last week
$lastcount = 0;
$result = mysqli_query($con, "SELECT * FROM table_name WHERE username='$username' AND date BETWEEN '$lastweekstart' AND '$lastweekend'");
$lastcount = mysqli_num_rows($result);

// counts descriptions written this week
if ($thisweekstart == $date) {
    $result = mysqli_query($con, "SELECT * FROM table_name WHERE username='$username' AND date='$date'");
} else {
    $result = mysqli_query($con, "SELECT * FROM table_name WHERE username='$username' AND date BETWEEN '$thisweekstart' AND '$date'");
}
$thiscount = mysqli_num_rows($result);

我对 PHP 还是很陌生,我的大脑在这个问题上被炒了。我需要焕然一新。你们(和女孩)怎么看?有没有比使用 strtotime() 更好的方法来处理几周?

4

2 回答 2

0

最好将 MySQL 用于这种功能(当 DB 为您提供这种功能时 - 使用它)

阅读 MySQL 中的 日期和时间函数。这是函数和示例的列表 https://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html

这只是一个起点。我认为在您的情况下,直接在 SQL 语句中使用 CUR_DATE()、DATE_SUB() 和 INTERVAL 就足够了。

您的商店日期应为以下任何类型的列:日期、日期时间或日期戳:http: //dev.mysql.com/doc/refman/5.1/en/datetime.html

于 2013-04-19T13:45:14.830 回答
0

我会把它放在这里,因为我可以更好地使用代码标签并拥有更多空间。

所以我们想要做的是从一个数据库中执行 2 个查询,其中第一个查询在上周一到上周日运行,第二个查询在这个周一到下周日运行

所以首先我们需要找到前一个星期天的日期和这个星期一的日期

$lastsunday = date('Y-m-d', strtotime('last sunday'));
$thismonday = date('Y-m-d', strtotime('this monday'));
//there's better ways of doing this probably but I'm just copy and pasting from your code above

现在我们需要创建我们的 2 个 sql 查询

$last_week_sql = "SELECT * FROM table WHERE DateColumn>=DATE_SUB('$lastsunday',INTERVAL 7 DAY) AND DateColumn<='$lastsunday'";

$this_week_sql = "SELECT * FROM table WHERE DateColumn>='$thismonday' AND DateColumn<=DATE_ADD('$thismonday',INTERVAL 7 DAY)";

现在您会注意到我正在使用 >= <= 而不是BETWEEN()。这是因为 BETWEEN 明确表示它忽略了起点和终点,所以如果你有数字BETWEEN(1,10),它只会匹配 2 -> 9 并忽略 1 和 10。它对日期也是如此。谨慎使用!

另请注意,当直接注入日期字符串变量时,它会用单引号 ' 包裹,这是因为 mysql 将日期输入视为字符串。

于 2013-04-19T13:50:57.613 回答