我试图避免重新编写一堆代码。请记住我使用yii框架。我在mysql数据库中有一个表有一个字段名称datetime是类型是datetime。所以它就是这样的。
2014-01-31 09:20:00
我需要查询该表只包含日期,以查找该日期的所有记录。
$date = 2014-01-31
$app = Appointments::model()->findAllByAttributes(array('datetime'=>$date));
我的问题是它不会返回任何内容,因为时间也包含在日期时间记录中。有没有办法让我添加mysql将随时读取和选择的通用时间,或者我可以做一些只会忽略时间并只选择日期的查询?
答案 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 );