0

私はこれで約1か月間問題を抱えています。このような大規模なプロジェクトを管理する負担を軽減するために、会社のコピーライティング管理システムを構築しました。システムは、週に完了したアイテムごとにライターに支払います。給与計算の制限により、彼らの支払い期間は木曜日の午前 0 時から水曜日の午前 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

コードタグをより適切に使用し、より多くのスペースを確保できるので、これをここに置きます。

したがって、私たちがやりたいことは、データベースから 2 つのクエリを実行することです。最初のクエリは先週の月曜日から最後の日曜日まで実行され、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)";

ここで、 >= <= と NOT を使用していることに気付くでしょうBETWEEN()。これは、BETWEEN が開始点と終了点を無視することを明示的に示しているためです。数値がある場合はBETWEEN(1,10)、2 -> 9 に対してのみ一致し、1 と 10 は無視されます。日付についても同様です。注意して使用してください!

また、日付文字列変数を直接注入する場合は、一重引用符で囲んでください。これは、mysql が日付入力を文字列として扱うためです。

于 2013-04-19T13:50:57.613 に答える
0

この種の機能にはMySQLを使用することをお勧めします(DBがこの種の機能を提供する場合は、それを使用してください)

MySQL の日付と時刻の関数について調べます。関数と例のリストは次のとおりです https://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html

これは単なる出発点です。あなたの場合、SQLステートメントでCUR_DATE()、DATE_SUB()、およびINTERVALを直接使用するだけで十分だと思います。

ストアの日付の列は、date、datetime、datestamp のいずれかのタイプである必要があります: http://dev.mysql.com/doc/refman/5.1/en/datetime.html

于 2013-04-19T13:45:14.830 に答える