我有以下简单的查询,可在MySQL中完美运行;
select * from client_contact
where date_format(client_next_contact_on, '%Y-%m-%d') = '2018-07-25'
然后我将其添加到我的codeigniter查询中,但是得到的错误是;
您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以在第3行的“ 2018-07-25”附近使用正确的语法
SELECT * FROM(client_contact)在哪里 dateformat(client_next_contact_on,'%Y-%m-%d')'2018-07-25'
根据上述外观,查询中缺少 = 。
这是我在codeigniter中的查询;
$today = new DateTime();
$today_formatted = $today->format('Y-m-d');
$this->db->where('dateformat(client_next_contact_on, \'%Y-%m-%d\')', $today_formatted);
$return = $this->db->get('client_contact')->row_array();
如果您想知道为什么我需要使用date_format,那是因为它以日期时间的形式存储在数据库中,用于其他目的。为此,我需要不限时间的今天需要联系的客户清单。
答案 0 :(得分:3)
只需在where语句中包含等号,然后将dateformat重命名,因为它不是MySQL中的函数。使用DATE_FORMAT
:
$this->db->where('DATE_FORMAT(client_next_contact_on, \'%Y-%m-%d\') =', $today_formatted);
现在,让我们来看看为什么代码点火器选择不包括等号的原因(根据文档,它应该有)。在codeigniter源的this line上,它调用此函数以确定它是否包含运算符。显然,因为您在,
后面放了一个空格,它认为您已包含一个运算符,因此只需进行简单的手动调整即可添加。
protected function _has_operator($str)
{
return (bool) preg_match('/(<|>|!|=|\sIS NULL|\sIS NOT NULL|\sEXISTS|\sBETWEEN|\sLIKE|\sIN\s*\(|\s)/i', trim($str));
}
您可以在此处查看正则表达式的匹配位置:https://regex101.com/r/BTuZxj/1