如何在Bookshelf中使用LIKE和Date列?

时间:2018-01-23 10:57:39

标签: postgresql knex.js bookshelf.js

当我尝试将LIKESTRING一起使用时,它会正常工作,但当我尝试使用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"

4 个答案:

答案 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)

    })