使用Yii Framework在数据库中查询具有datetime类型的字段。我需要按日期查询

时间:2014-01-17 07:39:14

标签: php mysql sql datetime yii

我试图避免重新编写一堆代码。请记住我使用yii框架。我在mysql数据库中有一个表有一个字段名称datetime是类型是datetime。所以它就是这样的。

2014-01-31 09:20:00

我需要查询该表只包含日期,以查找该日期的所有记录。

$date = 2014-01-31
$app = Appointments::model()->findAllByAttributes(array('datetime'=>$date));

我的问题是它不会返回任何内容,因为时间也包含在日期时间记录中。有没有办法让我添加mysql将随时读取和选择的通用时间,或者我可以做一些只会忽略时间并只选择日期的查询?

2 个答案:

答案 0 :(得分:3)

您可以使用条件datetime BETWEEN '2014-01-31 00:00' AND '2014-01-31 23:59'。 (顺便说一句,请考虑该列的更好名称。)

但你不能用findAllByAttributes来表达,你需要这样的东西:

$date = '2014-01-31'; // the date
$start_time = $date . ' 00:00:00';
$end_time = $date . ' 23:59:59';

$apps = Appointments::model()
  ->findAll('datetime BETWEEN :start_time AND :end_time', array(
    ':start_time' => $start_time,
    ':end_time' => $end_time,
  ));

编辑:我看到其他答案推荐不同的方法 - 要求MySQL转换其存储的值以匹配您的格式。 那不能扩展!如果你有成千上万的记录,这并没有太大的区别,但是如果你得到的数量远远超过那个数量级,那你就会看到令人讨厌的延迟。

如果您只是要求MySQL匹配一个值而不像我建议的那样进行转换,那么您可以在此列上添加索引并快速得到答案。

如果要求MySQL转换存储的值,则必须转换中的每条记录以确定它是否匹配。其他数据库可以在转换后的值上放置索引,但MySQL不能,因此每次运行此查询时,都必须再次转换每条记录...

答案 1 :(得分:-2)

$sql = ".........where date_format(datetime,'%Y-%m-%d')={$date}";

$app = Appointments::model()->findAllBySql($sql );