首页 > 解决方案 > API 结果与 SQL 查询不同的响应

问题描述

const amIAvailable = (request, response) => {
    const { start_date, end_date, my_emp_id } = request.body;
    console.log(request.body, 'body')
    pool.query(
        `
        SELECT EXISTS (SELECT me.employee_id from (
            select counts.employee_id from
            (select e.employee_id, count(e.employee_id) review_count from emp_details_2 e 
                  left join project_allocation pa 
                  on e.employee_id = pa.employee_id 
                  left join project pr 
                  on pa.pid = pr.pid 
                  where pa.project_alloc_status='In Progress' AND pr.start_date NOT BETWEEN $1 AND $2
                  and pr.end_date NOT BETWEEN $1 AND $2
                  group by (e.employee_id))
                  counts 
                  inner join role_allocation ra 
                  on counts.employee_id = ra.employee_id 
                  where counts.review_count <= ra.inclusive_review) me
                  where me.employee_id = $3)
        `, [start_date, end_date, my_emp_id],
        (error, results) => {
            if (error) {
                throw error;
            }
            response.status(200).json(results.rows);
            console.log(results.rows, 'result')
        }
    );
};

我已经编写了这个返回false特定日期的 API...但是当我在 pgadmin 中使用相同的值参数运行相同的查询时,它会返回true

我无法理解这种行为。日期采用MM/DD/YYYY格式。

标签: postgresqlapirestexpress

解决方案


可能原因是处理日期字符串的方式。替换此查询行

and pr.end_date NOT BETWEEN $1 AND $2

使用这个(即使字符串到日期的转换显式和受控)

and pr.end_date NOT BETWEEN to_date($1, 'MM/DD/YYYY') AND to_date($2, 'MM/DD/YYYY')

我建议无论何时涉及日期、时间戳、时区或编码,您始终使用明确的设置/规则,并且永远不要依赖默认值。


推荐阅读