2013-05-08 112 views
1

使用下面的代码,我无法检查MySQL'date'列中是否存在指定的日期。如何检查MySQL'date'列中是否存在特定日期?

$data = array(1367971200); 

$s=$dbh->prepare(" 
    SELECT DISTINCT 
     `date` 
    FROM 
     `report_coa_bal_hist` 
    WHERE 
     UNIX_TIMESTAMP(`date`) = ? 
"); 

if ($s->execute($data)) { 

    if ($s['date'] == null) { 

     return false; 
    } 

    return true; 

} 

它返回false,尽管事实上,我可以看到在phpMyAdmin中显示的日期“2013年5月8日”。

该表本身包含该日期的70多个条目。它总是会做,如果它包含任何东西,但我只想知道它在现阶段是否存在。

日期字段是MySQL'日期'类型。我怀疑这个错误是在我构建查询的PDO调用时发生的。

UPDATE

更新$r['date']到`$ S [ '日期']。我怀疑,我仍然有一个问题的结构,但可能需要修复查询,使它给我们的结果,然后再着重于此。

也尝试直接对数据库运行查询并获得空结果集,尽管能够看到目标日期存在。仍然很困惑!

+0

你是否试过直接对数据库运行查询? – 2013-05-08 07:05:11

+0

'$ r ['date']'或'$ s ['date']' – 2013-05-08 07:06:02

+0

哪里'$ r ['date']'甚至来自? – BlitZ 2013-05-08 07:07:06

回答

2

试试这个

$data = array(1367971200); 

$s=$dbh->prepare(" 
SELECT COUNT(`date`) as c_date 
FROM 
    `report_coa_bal_hist` 
WHERE 
    UNIX_TIMESTAMP(`date`) = ?"); 

if ($s->execute($data)) { 
    $result = $s->fetch(PDO::FETCH_ASSOC); 
    if ($result['c_date'] > 0) { 
     return false; 
    } 
    return true; 
} 
+1

谢谢。我正在检查这个,但却被意外的传出去了。将会走了几个小时。进一步检查后会接受答案(我认为这个答案可能是答案)。 – 2013-05-08 07:28:31

+1

对不起,谢谢大家的参与。这个答案是我用过的。它运作良好。谢谢Yogesh。 – 2013-05-08 12:03:18

0

你不能选择带有因为它们更准确自然的UNIX时间戳(即秒)一整天,你需要的文本版本:

$data = array(date('Y-m-d', 1367971200)); 

$stmt = $dbh->prepare("SELECT COUNT(*) 
    FROM `report_coa_bal_hist` 
    WHERE `date` = ? 
"); 

$stmt->execute($data); 
$count = current($stmt->fetchAll(PDO::FETCH_COLUMN, 0)); 
return $count > 0; 

取请注意运行脚本的服务器与数据库服务器本身之间的时区差异。

-2

有许多缺陷与你的代码,而不是一个:你检查你的SQL

  • 你所得到的结果
  • 的方式检查
  • 方式的价值

    • 格式

      所以,代码必须是

      $data = array('2013-05-07'); 
      $sql = "SELECT 1 FROM report_coa_bal_hist WHERE `date` = ? LIMIT 1"; 
      $stm = $dbh->prepare($sql); 
      $stm->execute($data); 
      return $stm->fetchColumn(); 
      
  • +0

    而不必将格式化的字符串传递给日期,这也应该作为查询(以时间戳作为参数):SELECT ... WHERE date = DATE(FROM_UNIXTIME(?))LIMIT 1'。 'DROM_UNIXTIME(...)'将时间戳转换为'datetime','DATE()'将其转换为'date'(即从第二天降低精度)。 – Lukas 2013-05-08 07:52:52

    +0

    不是“代替”而是“也是”。日期转换有很多方法,但这不是问题的主题。 – 2013-05-08 08:29:47