0

次の形式でいくつかの日付を varchar として保存しています: 01-01-2012

日付間で検索したいのですが、残念ながら期待どおりに機能していません。同じ質問(ちょっと)がある他のスレッドを探しましたが、そこで提供された回答はうまくいきませんでした。

これが私のコードです:

$fromday = $_POST['fromday'];
$frommonth = $_POST['frommonth'];
$fromyear = $_POST['fromyear'];

$tillday = $_POST['tillday'];
$tillmonth = $_POST['tillmonth'];
$tillyear = $_POST['tillyear'];

$vanaf = "$fromday-$frommonth-$fromyear";
$tot = "$tillday-$tillmonth-$tillyear";

// zoeken
$sel = "SELECT * FROM bestelling WHERE verzenddatum >= '$vanaf' AND verzenddatum <= '$tot'";
$dosel = mysql_query($sel) or die(mysql_error());

while($row = mysql_fetch_assoc($dosel))
{
    $datum = $row['verzenddatum'];

    echo $datum;
}

私が間違っていることを教えてください!

4

7 に答える 7

5

DATEクエリが有効なフィールドまたはフィールドの比較を行っていないため、行が返されませんDATETIME。日付を型として保存する必要がありDATEますが、できることは次のとおりです。

// Switch the order of date elements:
$vanaf = mysql_real_escape_string("$fromyear-$frommonth-$fromday");
$tot = mysql_real_escape_string("$tillyear-$tillmonth-$tillday");

$sel = "SELECT * FROM bestelling WHERE STR_TO_DATE(verzenddatum, '%d-%m-%Y') BETWEEN '$vanaf' AND 'tot'";

このmysql_real_escape_string()関数は、元のコードが脆弱であった SQL インジェクションのリスクを単純に軽減します。

MySQL 関数STR_TO_DATE()は、文字列を有効な MySQLDATEタイプに変換します。%d-%m-%Y現在 varchar 文字列にある形式ですが、MySQL が範囲比較に使用できる形式にSTR_TO_DATE変換します。'%Y-%m-%d'

また、 とBETWEEN同じものなので、SQL の構文を使用していますval >= val1 AND val <= val2。より明確でシンプルです: val BETWEEN val1 AND val2.

于 2012-07-05T18:32:23.103 に答える
1

このアプローチで発生する避けられないパフォーマンスの問題が発生するまで待つのではなく、今すぐフィールドを適切なフィールドに変換することでこれを修正し、苦労することを強くお勧めします。DATEできない場合は、これを試してください:

$fromday = $_POST['fromday'];
$frommonth = $_POST['frommonth'];
$fromyear = $_POST['fromyear'];

$tillday = $_POST['tillday'];
$tillmonth = $_POST['tillmonth'];
$tillyear = $_POST['tillyear'];

$sel = "SELECT * FROM bestelling WHERE SUBSTRING(verzenddatum, 7, 4) BETWEEN '$fromyear' AND '$tillyear' AND SUBSTRING(verzenddatum, 4, 2) BETWEEN '$frommonth' AND '$tillmonth' AND SUBSTRING(verzenddatum, 1, 2) BETWEEN '$fromday' AND '$tillday';"

(ここでの希望は、レコードの日付が「開始年」と「終了年」の外にある場合、MySQL クエリ オプティマイザがこれに気づき、早期に救済することです)

于 2012-07-05T18:44:43.963 に答える
1

DATE日付をフィールド タイプまたはフィールド タイプとして保存する必要がありDATETIMEます。スクリプトを使用してデータベースを移行します (小さな DB ではそれほど難しくありません。テーブルをバックアップし、すべての日付を適切な形式に変換し、スキーマを変更してからデータを再挿入します。バックアップが爆発した場合はバックアップを復元します。 )これを修正した後、すべてが期待どおりに機能します。

于 2012-07-05T18:29:29.723 に答える
0

MySQL の標準の日付形式は「年-月-日」です。これ$vanaf = "$fromyear-$frommonth-$fromday";を試して、$tot. それを試して、それが機能するかどうかを確認してください。

于 2012-07-05T18:26:48.323 に答える
0

いくつかの理論:

$startdate = sprinf('%04d-%02d-%02d', $year, $month, $day);
$enddate = sprinf('%04d-%02d-%02d', $year, $month, $day);

$query = "SELECT * FROM orders WHERE date BETWEEN '{$startdate}' AND '{$enddate}'";

ヒント: PDO と準備済みステートメントに時間を投資してください。もう mysql_ 関数を使用しないでください。

于 2012-07-05T18:30:25.460 に答える
0

PHP を使用しているため、MySQL でデータ型をINT(整数) に設定し、日付に UNIX タイムスタンプを使用できます。これは、より大きい値とより小さい値を検索するのに適した方法です。

次のようなものを使用できます。

$fromday = strtotime($_POST['fromday']);
于 2012-07-05T18:32:13.787 に答える