【问题标题】:mysql "between and" query including the first day and the last daymysql "between and" 查询包括第一天和最后一天
【发布时间】:2021-04-26 23:54:42
【问题描述】:

我有一个用于从数据库中提取数据的查询,但我发现它错过了第一天和最后一天。在此示例中,它跳过了将“scadenze”设置为“01-05-2021”的记录,并错过了将“scadenze”设置为“31-05-2021”的记录。我怎么能包括这些天?

这是我使用的查询:

$anno = date('Y'); // CURRENT YEAR
$mese = (date('m')+1); // THE MONTH THAT I NEED (THE NEXT ONE)

// FIRST DAY OF THE MONTH

$giornoinizio = '01';
$a = '';
$a .= $anno . '-' . $mese .'-' . $giornoinizio;

// LAST DAY OF THE MONTH

$giornofine = cal_days_in_month(CAL_GREGORIAN,$mese,$anno);
$b = '';
$b .= $anno . '-' . $mese .'-' . $giornofine;

$sql = "SELECT * FROM condominio WHERE scadenze BETWEEN '$a' AND '$b' ORDER BY scadenze ASC";

此查询“有效”,但它删除了第一天和最后一天。我如何才能包含它们?

谢谢

【问题讨论】:

  • 请问scadenze是什么数据类型
  • 对不起,是“时间戳”
  • 如果您的$a 和$b 包含没有时间部分的日期,则必须选择第一天。
  • @Akina 你能解释一下这是什么意思吗? :)

标签: php mysql


【解决方案1】:

你让自己的生活变得相当困难。

您可以使用此日期代码简单地获取 2 个日期

$a = date('Y-m-d', strtotime('first day of +1 month'));
$b =  date('Y-m-d', strtotime('last day of +1 month'));

$sql = "SELECT * FROM condominio WHERE scadenze BETWEEN '$a' AND '$b' ORDER BY scadenze ASC";

但是这种将数据连接到查询中是一个坏习惯,进入它可以鼓励您SQL Injection Attack。 甚至if you are escaping inputs, its not safe! 你应该总是使用prepared parameterized statements 在MYSQLI_ 或PDO API 中,而不是将用户提供的值连接到查询中。

不确定您使用的是哪个扩展,所以我只能建议一个 PDO 解决方案

$a = date('Y-m-d', strtotime('first day of +1 month'));
$b =  date('Y-m-d', strtotime('last day of +1 month'));

$sql = "SELECT * FROM condominio
        WHERE scadenze BETWEEN :a AND :b 
        ORDER BY scadenze ASC";
$stmt = $con->prepare($sql);
$stmt->execute([':a'=>$a, ':b'=>$b]);

$result = $stmt->fetchAll();

foreach ( $results as $row ){
    // process each row
}

【讨论】:

  • 我在这个项目中使用 pdo,但我认为这个查询是“安全的”,因为它是由按钮触发的,并且不允许用户将数据输入其中。但是,如果我错了,请告诉我
  • @Strawberry 是的,更精神失常
【解决方案2】:

尝试在你的列上使用 date() 函数

SELECT * FROM condominio WHERE date(scadenze) BETWEEN '$a' AND '$b' ORDER BY scadenze ASC

【讨论】:

  • 它似乎有效,如果它给了我所有记录,我需要进行更多调查,目前它看起来很好但我需要仔细检查:)
  • 如果您有一个时间戳列,当您使用 between 或任何子句时,它也会搜索时间,date() 函数将排除时间,因为您为 $a 和 $b 提供的日期格式'Y-m-d'如果对你有好处,别忘了选择最佳答案,谢谢!
  • 你给我的所有信息都很好。那么,是否可以为所有人投票“+1”?
  • @P.Davide 没关系 :),只是为了解决你的 QS。
  • 是的,您可以随心所欲地投票,投票只是意味着这个答案很有帮助/有用。通常不止一种适合这种情况
猜你喜欢
  • 2017-07-21
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2017-08-19
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多