Sebaiknya simpan tanggal Anda sebagai DATETIME
. Karena Anda memiliki nilai-nilai ini, itu sudah menunjukkan bahwa bidang basis data Anda bukan dari date
ketik, seperti memasukkan string tersebut ke date
bidang tidak akan menghasilkan kesalahan.
Jika ini tidak memungkinkan untuk diubah, maka Anda dapat menggunakan STR_TO_DATE
fungsi:
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')
Tapi itu benar-benar solusi yang lebih rendah.
Tetap saja, harapan Anda untuk hanya mendapatkan satu baris tampaknya aneh. Tentu saja baris ketiga memenuhi persyaratan, karena tanggal mulai/jatuh tempo adalah sebelum/setelah tanggal yang Anda periksa, terlepas dari bagian waktunya.
Tambahan
Dalam komentar Anda mengatakan Anda ingin menerapkan logika yang berbeda. Saya menebak Anda ingin membandingkan secara terpisah komponen tanggal dan waktu, dan keduanya mematuhi between
kondisi. Ini benar-benar harus dijelaskan dalam pertanyaan, karena saat ini tidak ditentukan.
Dalam hal ini, Anda dapat menggunakan DATE_FORMAT
untuk mengekstrak hanya bagian waktu, dan ulangi kondisinya dengan itu:
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')
Kueri ini akan mengecualikan 3 baris dari hasil.