如何仅通过年份查询数据库中DATETIME字段对应的行?
嘿,这个问题我太懂了!你现在的写法直接把dateCreated等于'2020'肯定查不到数据——毕竟dateCreated是DATETIME类型,存的是带时分秒的完整时间(比如2020-05-08 14:30:34),直接匹配字符串'2020'完全对不上。给你几个在Yii框架里可行的解决方案:
方案1:用Yii封装的
year()查询条件(最推荐) Yii的ActiveQuery专门提供了针对日期时间字段的年份筛选方法,写法简洁还安全:
$records = MedicalRecord::find() ->where(['year', 'dateCreated', 2020]) ->all();
这个方法会自动生成对应的SQL(比如MySQL里的YEAR(dateCreated) = 2020),还能帮你避免SQL注入问题,是最规范的写法。
方案2:时间范围匹配(更利于索引命中)
如果你的dateCreated字段有索引,用范围查询的效率会更高,直接匹配该年份的首尾时间:
$startOfYear = '2020-01-01 00:00:00'; $endOfYear = '2020-12-31 23:59:59'; $records = MedicalRecord::find() ->where(['between', 'dateCreated', $startOfYear, $endOfYear]) ->all();
这种写法让数据库能直接利用字段索引,查询速度会比调用YEAR()函数更快。
方案3:原生SQL条件(适合复杂自定义场景)
要是你需要更灵活的自定义逻辑,也可以直接写原生SQL的条件,但记得一定要用参数绑定防止注入:
$records = MedicalRecord::find() ->where('YEAR(dateCreated) = :targetYear', [':targetYear' => 2020]) ->all();
内容的提问来源于stack exchange,提问作者user1525
相关产品推荐
相关产品推荐

