查找当前周和上周的SQL记录的问题

时间:2013-04-19 13:28:51

标签: php mysql sql date strtotime

我一直有这个问题大约一个月了。我为公司建立了一个文案管理系统,以帮助减轻管理这样一个大项目的压力。系统按每周完成的项目支付作者费用。由于工资限制,他们的工资期是从周四凌晨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()更好的方式来进行几周?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

所以我们要做的是从db执行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)";

现在你会注意到我正在使用&gt; =&lt; =而不是BETWEEN()。这是因为BETWEEN明确地忽略了起点和终点,所以如果你有数字BETWEEN(1,10)它只会匹配2 - &gt; 9并忽略1和10.它与日期相同。请谨慎使用!

还要注意直接注入日期字符串变量时,用单引号括起来'这是因为mysql将日期输入视为字符串。