当我尝试将LIKE
与STRING
一起使用时,它会正常工作,但当我尝试使用DATE
类型列时,它会给出错误。这是我的控制器代码:
router.route('/fetchStudentAttendance').post(function(req, res) {
StudentAttendance
.query(function(qb) {
qb.where('date', 'LIKE', '"2018-01%"');
// qb.where('remarks', 'LIKE', '"A%"'); // this is working
})
.where({'class_id': req.body.class_id, 'section_id': req.body.section_id})
.fetchAll()
.then(studentAttendance => {
let content = {
data: studentAttendance,
success: true,
message: 'Record Not Found',
};
return res.send(content);
})
.catch(error => {
let content = {
data: error,
success: false,
message: 'Error while fetching Student Attendance.',
};
return res.send(content);
});
});
使用Date值,它会将以下错误输出到控制台:
code:"42883"
file:"parse_oper.c"
hint:"No operator matches the given name and argument type(s). You might need to add explicit type casts."
length:202
line:"726"
name:"error"
position:"70"
routine:"op_error"
severity:"ERROR"
答案 0 :(得分:1)
我更喜欢用
进行检查.where(knex.raw('to_char(date, \'YYYY-MM\')'), '2018-01')
提供以下查询
where to_char(date, 'YYYY-MM') = '2018-01'
您可以在official documentation上阅读有关日期格式化功能的内容,有很多功能和示例。
答案 1 :(得分:1)
LIKE用于字符串值,不适用于DATE(或时间戳或数字)值。
如果您要使用特定日期范围内的行,最好使用带有日期的比较,
where date_column >= date '2018-01-01' and date_column < date '2018-02-01'
我不知道Knex,但是必须有一种方法可以指定这样的条件。
这还有一个好处,即数据库能够使用date_column
上的索引。
答案 2 :(得分:0)
LIKE仅适用于字符串。来自Postgres文档:
如果字符串与提供的字符串匹配,则LIKE表达式返回true 图案
请参阅:https://www.postgresql.org/docs/9.0/static/functions-matching.html
要解决此限制,您需要将日期作为字符串类型存储在数据库中,或使用原始查询将数据库日期字段转换为具有db函数的字符串(我不确定哪个函数?)然后在该字符串上使用LIKE运算符。
编辑:哦,找到了一个SQL示例,用于将DateTime(不确定这是你的日期类型?)转换为字符串并且喜欢它。 (问题:SQL LIKE Statement on a DateTime Type)
SELECT *
FROM MyTable
WHERE CONVERT(VARCHAR, CheckDate, 120) LIKE '%2009-1%'`
快乐的编码!加里。
答案 3 :(得分:0)
尝试使用书架和Knex进行以下查询,该查询可在列'created_at'类型的时间戳上使用,其日期类似于'2019-07-05 11:56:30'。
Db_model.query(qb =>{
qb.where('created_at', 'LIKE', '2019-07%')
})
.fetchPage({
pageSize: 15,
page: 1,
})
.then(function (results) {
console.log(result)
}).catch((error)=>{
console.log(error)
})