我的数据库中有120个数据,我的目标位于tanggal
列,它们都有VARCHAR datatype
。其中大多数都有'04/12/2017'
个值,我已插入一个值来触发具有'20/11/2017'
和20/12/2017'
值的数据。
我想使用BETWEEN
函数选择数据,但是当我运行查询时,它只显示我在函数之间提到的日期。
结果中不会显示所有'04/12/2017'
值。
为什么会这样?请帮忙..
这是我的代码:
//filter query
$tanggal = $_POST['tanggal'];
$jenis_pelanggaran = $_POST['jenis-pelanggaran'];
$lokasi_outlet = $_POST['lokasi-pelanggaran'];
$pelanggar = $_POST['pelanggar'];
$lastmonth = "20/".date("m/Y", strtotime("-1 months"));
$now = "20/".date("m/Y");
echo $lastmonth . "<br>" . $now;
// Define and execute the query.
// Note that the query is executed with a "scrollable" cursor.
$sql = "SELECT
dbo.pelanggaran.id_pelanggaran,
dbo.pelanggaran.tanggal,
dbo.pelanggaran.waktu_pelanggaran,
dbo.pelanggaran.nama_pelanggar,
dbo.pelanggaran.bukti_screenshot,
dbo.pelanggaran.bukti_rekaman,
dbo.pelanggaran.bukti_dokumen,
dbo.jenis_pelanggaran.pelanggaran,
dbo.jenis_pelanggaran.j_denda,
dbo.daftar_outlet.nama_outlet
FROM
dbo.pelanggaran
INNER JOIN dbo.jenis_pelanggaran ON dbo.pelanggaran.id_jenis_pelanggaran = dbo.jenis_pelanggaran.id
INNER JOIN dbo.daftar_outlet ON dbo.pelanggaran.id_lokasi_outlet = dbo.daftar_outlet.id
WHERE
dbo.pelanggaran.tanggal BETWEEN '$lastmonth' AND '$now'
AND
dbo.pelanggaran.nama_pelanggar LIKE '%$pelanggar%'
AND
dbo.daftar_outlet.nama_outlet LIKE '%$lokasi_outlet%'
AND
dbo.jenis_pelanggaran.pelanggaran LIKE '%$jenis_pelanggaran%' ORDER BY tanggal DESC";
$stmt = sqlsrv_query($conn, $sql, array(), array( "Scrollable" => 'static' ));
if ( !$stmt )
die( print_r( sqlsrv_errors(), true));
答案 0 :(得分:2)
不要将日期存储在字符串中,这是这次灾难的秘诀
将日期存储在日期中,这不会发生
如果您坚持要将日期存储在字符串中,请将它们存储为YYYYMMDD格式,以便它们正确排序,并且至少不会出现这样的滋扰效果(您只会在其他方面表现不佳)使用日期作为任何类型的数学运算的字符串的区域和困难,例如计算出日期的日期是多少)
“04/12/2017”不在“20/11/2017”和“20/12/2017”之间,“大象”介于“你好”和“再见”之间
认为强类型,而不是字符串类型:)
答案 1 :(得分:0)
它们是字符串,而不是日期字符串。如果你不认为它们是一个约会,很容易看出为什么它们没有像你期望的那样排序。
0412
2011
2012
0412显然不是在2011年和2012年之间。不仅因为它们是字符串,0412也不在410和415之间,但它在0410和0415之间。我希望有所帮助。
当存储为字符串时,日期和时间[和数字]将失去意义,并且还可能添加不正确的值。 13/13/2017是一个完全有效的字符串,但无论您在哪个地区,都会抛出无效的日期错误。