Php SQL上的between函数之间的字符串不包含

Php SQL上的between函数之间的字符串不包含,php,sql-server,Php,Sql Server,我的数据库中有120个数据,我的目标是tanggal列,它们都有一个VARCHAR数据类型。其中大多数都有“2017年12月4日”的值,我已经插入了一个值来触发具有“2017年11月20日”和“2017年12月20日”值的数据 我想使用BETWEEN函数选择数据,但当我运行查询时,它只显示我在BETWEEN函数中提到的日期 所有“2017年12月4日”值均未显示在结果中 为什么会发生这种情况?请帮忙 这是我的代码: //filter query $tanggal = $_P

我的数据库中有120个数据,我的目标是tanggal列,它们都有一个VARCHAR数据类型。其中大多数都有“2017年12月4日”的值,我已经插入了一个值来触发具有“2017年11月20日”和“2017年12月20日”值的数据

我想使用BETWEEN函数选择数据,但当我运行查询时,它只显示我在BETWEEN函数中提到的日期

所有“2017年12月4日”值均未显示在结果中

为什么会发生这种情况?请帮忙

这是我的代码:

//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));

不要用字符串存储日期,这会导致这场灾难

将日期存储在日期中,这样就不会发生

如果您坚持要以字符串形式存储日期,请以YYYYMMDD格式存储,以便正确排序,至少不会出现像这样令人讨厌的效果,你只会在其他方面表现不佳,并且很难将日期作为字符串来处理任何类型的数学运算,比如计算日期是多少天前

2017年12月4日不是在2017年11月20日和2017年12月20日之间,就像大象在你好和再见之间一样


考虑强类型,而不是严格类型:

它们是字符串,而不是日期字符串。如果你不认为他们是约会对象,那么很容易理解为什么他们没有按照你的预期进行分类

0412
2011
2012
0412显然不是在2011年和2012年之间。也不是因为它们是字符串,所以0412也不在410和415之间,而是在0410和0415之间。我希望这有帮助


当存储为字符串时,日期和时间[和数字]将失去其意义,也可能添加不正确的值。2017年13月13日是一个完全有效的字符串,但无论您在哪个地区,都会抛出一个无效的日期错误。

Guh,日期最先显示的日期。我只是将所有内容作为int时间戳放入数据库。如果我需要直观地输出它,那么php的日期就可以轻松地完成它的工作。这里的问题不是您的查询,而是您决定将日期存储为字符数据。不要这样做!!!但是当我将数据类型设置为date并试图显示数据时,它显示了一个错误,先生。可恢复的致命错误:类DateTime的对象无法转换为字符串,即使我的代码不是OOP样式。您的帽子颠倒了:我是澳大利亚人;一切都颠倒了: