SQL上的BETWEEN函数之间的字符串不包括在内

时间:2017-12-19 21:04:26

标签: php sql-server

我的数据库中有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));

2 个答案:

答案 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是一个完全有效的字符串,但无论您在哪个地区,都会抛出无效的日期错误。