日付はDATETIME
として保存することをお勧めします 。これらの値があるため、データベースフィールドがdate
ではないことがすでに示されています そのような文字列をdate
に挿入するように入力します フィールドはエラーを生成しません。
これを変更できない場合は、STR_TO_DATE
を使用できます。 機能:
SELECT *
FROM `task`
WHERE t_status !=3
AND STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p') BETWEEN
STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p') AND
STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p')
しかし、それは本当に劣った解決策です。
それでも、1行だけを取得するというあなたの期待は奇妙に思えます。確かに、3行目は要件を満たしています。これは、開始日/期日が、時間の部分に関係なく、チェックしている日付の前後であるためです。
補遺
コメントでは、別のロジックを適用したいと言っています。私は推測している 日付と時刻のコンポーネントを別々に比較し、両方をbetween
に準拠させたい場合 調子。現在は指定されていないため、これは質問で実際に説明する必要があります。
その場合は、DATE_FORMAT
を使用できます 時間部分のみを抽出し、それを使用して条件を繰り返します:
SELECT *,
STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p'),
STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p'),
STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p')
FROM `task`
WHERE t_status !=3
AND STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p') BETWEEN
STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p') AND
STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p')
AND DATE_FORMAT(STR_TO_DATE('2018-01-19 03:56 PM', '%Y-%m-%d %h:%i %p'), '%h:%i') BETWEEN
DATE_FORMAT(STR_TO_DATE(t_started_on, '%Y-%m-%d %h:%i %p'), '%h:%i') AND
DATE_FORMAT(STR_TO_DATE(t_due_on, '%Y-%m-%d %h:%i %p'), '%h:%i')
このクエリは、結果から3行を除外します。