PHP / SQL - 从两个日期之间的SQL查询返回布尔结果

时间:2015-05-27 23:38:58

标签: php mysql sql-server boolean

我被要求建立一个调度程序,根据开始/结束日期在网站上显示特别优惠。部分原因是,如果存在有效的要约,则有条件地显示指向该页面的链接。但我完全不知所措。

以下查询提取任何属于正确日期的当前要约:

$now = date('Y-m-j');
$sql = "SELECT * FROM sample WHERE date_from <= '".$now."' AND date_to > '".$now."'";

我无法开发此查询以返回TRUE / FALSE值(我需要现有的导航结构 - 由其他开发人员创建)。有一些帖子声明在现有查询中使用EXISTS()或SELECT CASE WHEN EXISTS(),然后输出THEN / ELSE。但经过几个小时的尝试破解,我只是设法犯了错误。

我知道可能可以解决这个问题,但我想从SQL查询本身返回一个布尔值。

2 个答案:

答案 0 :(得分:1)

案件应该有效:

select
CASE 
  WHEN date_from <= '".$now."' AND date_to > '".$now."' THEN 'TRUE'
  ELSE 'FALSE'
END

from yourtable 

也许更好

SELECT exists (
  SELECT * FROM sample WHERE date_from <= '".$now."' AND date_to > '".$now."') as BOO
如果匹配,

BOO将为1

答案 1 :(得分:0)

PHP数据库查询将资源返回到查询结果。 结果是select语句返回的元素的数组或对象。

如果要从sql查询本身返回一个布尔值。然后你必须将*(星号)改为布尔值。

根据您使用的数据库,可用的确切语法和功能会发生变化。但我们假设微软sql或postgres ..

Postgres的:

$sql = "SELECT (count(*)>0) as bool_result FROM sample WHERE date_from <= '".$now."' AND date_to > '".$now."'";

Microsoft SQL:

$sql = "SELECT (case when count(*)>0 then 1 else 0 end) as int_result FROM sample WHERE date_from <= '".$now."' AND date_to > '".$now."'";

Microsoft SQL使用微小的int或bit来表示布尔值。因此无法返回严格意义上的“布尔”。因此,当布尔比较为1或0的结构时的情况。

如果你想知道是否返回了任何行而你不关心结果集,那么mssql_num_rows或pg_num_rows可能是你的答案。两者都返回查询结果集中的行数。然后,您可以将其与等于0或1进行比较。

这与您可以获得的答案非常接近,而无需提供代码示例和更多详细信息。

以下是一个例子:

$sql = "SELECT * FROM sample WHERE date_from <= '".$now."' AND date_to > '".$now."'";
$res = pg_query($sql);
if( pg_num_rows($res) > 0 ) 
    ShowNav();