1

これは私の問題です:

いくつかの製品を含む mysql データベースにテーブルがあり、製品が有効な期間を決定する "date_from" と "date_to" という 2 つの列があります。

私の Web サイトには、管理者が 2 つの日時値を選択できるフォームがあり、製品の有効期間が管理者が選択した期間と交差する場合、ページは製品リストを更新します。

これは私のクエリであり、私が望むものを達成するために使用しています:

$sql="SELECT * FROM presents WHERE (date_from>".$date_from." AND date_to<".$date_to.") OR (date_from>".$date_from." AND date_to>".$date_to.") OR (date_from<".$date_from." AND date_to>".$date_to.") OR (date_from<".$date_from." AND date_to<".$date_to.")";

私はこのエラーが発生します:

mysql は次のように述べています: MySql エラー番号: 1064 MySql エラーの説明: SQL 構文にエラーがあります。'.26 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。12:11:43 AND date_to<2012.07.30. 12:11:46) OR (date_from>2012.07.26.12:11:' 行 1

何か案は?

*編集

提案どおりにクエリを変更し、変数に一重引用符を追加しました。エラーは発生しませんが、クエリが想定どおりに動作していないようです。製品リストは同じままです...クエリは次のとおりです。

$sql="SELECT * FROM presents WHERE (date_from>'".$date_from."' AND date_to<'".$date_to."') OR (date_from>'".$date_from."' AND date_to>'".$date_to."') OR (date_from<'".$date_from."' AND date_to>'".$date_to."') OR (date_from<'".$date_from."' AND date_to<'".$date_to."')";

テーブルに次の行があるとします。

ID名 date_from date_to

1 テスト 2012-07-24 16:40:00 2012-07-31 16:40:00


行を返すには、これらすべてのピリオドが必要です。

2012-07-23 16:40:00 から 2012-08-01 16:40:00

2012-07-23 16:40:00 から 2012-07-28 16:40:00

2012-07-26 16:40:00 から 2012-07-28 16:40:00

2012-07-26 16:40:00 から 2012-08-01 16:40:00

4

7 に答える 7

2

変数を引用する必要があります。

ただし、SQL を連結するのではなく、代わりにプレースホルダーを使用することをお勧めします。

于 2012-07-25T10:27:27.420 に答える
1

日付を一重引用符で囲む必要があると確信しています:

date_from > '".$date_from."' AND
于 2012-07-25T10:27:28.167 に答える
1

次のように日付を引用符で囲む必要があります'".$date_from."'

編集:試してください:

$sql="SELECT * FROM presents WHERE '".$date_from."' BETWEEN date_from AND date_to";
于 2012-07-25T10:27:32.460 に答える
1

日付と時刻のリテラルで述べたように:

MySQL は、次の形式を認識DATETIMEしてTIMESTAMP値を取得します。

  • 'YYYY-MM-DD HH:MM:SS'または'YY-MM-DD HH:MM:SS'形式の文字列として。ここでも「リラックスした」構文が許可されています。日付部分または時間部分の間の区切り文字として、任意の句読点を使用できます。たとえば、'2012-12-31 11:30:45''2012^12^31 11+30+45''2012/12/31 11*30*45'、および'2012@12@31 11^30^45'は同等です。

  • 'YYYYMMDDHHMMSS'文字列が日付として意味をなす場合、どちらの'YYMMDDHHMMSS'形式にも区切り文字がない文字列として。例えば、'20070523091528''070523091528'は と解釈されます'2007-05-23 09:15:28'が、'071122129015'違法(無意味な細かい部分があります)で になり'0000-00-00 00:00:00'ます。

  • 数値が日付として意味がある場合は、YYYYMMDDHHMMSSまたはYYMMDDHHMMSS形式の数値として。たとえば、19830905132800830905132800は として解釈され'1983-09-05 13:28:00'ます。

文字列形式を使用している場合は、文字列が適切に引用されていることを確認する必要があります。

于 2012-07-25T10:28:57.793 に答える
1

の形式で日時を渡しているstringため、次のように一重引用符で囲む必要があります。

... (date_from<'".$date_from."' AND date_to>'".$date_to."') ...

または、使用する変数の形式を数値 (YYYYMMDDHHmmss形式) に変更すると、引用符は不要になります。

于 2012-07-25T10:29:54.827 に答える
0

ここにあなたのためのSQLの完成版があります:)。あなたが言及したフィールドでテストテーブルを作成しましたが、このSQLは私にとって完璧に実行されます-

$sql="SELECT * FROM presents WHERE (date_from > STR_TO_DATE('".$date_from."', '%Y-%m-%d %H:%i:%s') AND date_to < STR_TO_DATE('".$date_to."', '%Y-%m-%d %H:%i:%s')) OR (date_from > STR_TO_DATE('".$date_from."', '%Y-%m-%d %H:%i:%s') AND date_to >  STR_TO_DATE('".$date_to."', '%Y-%m-%d %H:%i:%s') ) OR (date_from < STR_TO_DATE('".$date_from."', '%Y-%m-%d %H:%i:%s') AND date_to > STR_TO_DATE('".$date_to."', '%Y-%m-%d %H:%i:%s')) OR (date_from < STR_TO_DATE('".$date_from."', '%Y-%m-%d %H:%i:%s') AND date_to <STR_TO_DATE('".$date_to."', '%Y-%m-%d %H:%i:%s'))";

phpMyAdminでSQLを実行しているときに取得したものを添付- ここに画像の説明を入力

これで問題が発生した場合はお知らせください。

于 2014-01-29T07:45:57.277 に答える
0

次のような別の構文を使用してみてください。

WHERE OrderDate BETWEEN '01/01/2006' AND '01/02/2006'

ソース: http://www.demiliani.com/blog/archive/2006/01/19/3384.aspx

于 2012-07-25T10:28:59.073 に答える