【问题标题】:How to use postgres ::date with knex.js如何在 knex.js 中使用 postgres ::date
【发布时间】:2016-07-01 00:43:13
【问题描述】:

我有一个timestamp 类型的列。我需要按给定日期选择所有记录。在 sql 中是这样的:

select * from "table" where "date"::date = '2015-08-22';

我尝试了以下操作:

db('table').select().where('date::date', '=', date);

但这会引发错误

错误:select * from "table" where "date::date" = $1 - column "date::date" 不存在

因为 knex 地方引号错误。

有没有办法执行这样的查询?或者我应该使用whereRaw

【问题讨论】:

  • 我希望列名date 仅用作示例。在实际应用中使用这个列名真的很糟糕。

标签: node.js postgresql date knex.js


【解决方案1】:

对于这样的方言特定功能,您通常需要使用knex.raw。在这种情况下,您可以使用简写,whereRaw

db('table').select().where(knex.raw('??::date = ?', ['date', date]));
db('table').select().whereRaw('??::date = ?', ['date', date]);

【讨论】:

    【解决方案2】:

    你把类型转换的想法颠倒了,因此问题是:数据转换应用于值,而不是列名。

    即改成这样:

    select * from "table" where "date" = '2015-08-22'::date;
    

    如果您需要从中提取一部分或匹配其他类型,您仍然可以在列 date 上使用日期/时间函数。

    【讨论】:

    • 您能否提供一个示例,说明如何在knex.js 中实现这一点?
    • @kuanb 抱歉,我不使用 knex,只使用基于查询的框架,例如 pg-promise
    • 您也可以将列转换为::date。对于 TIMESTAMP 列,这将产生忽略任何比较的时间部分的效果。
    【解决方案3】:

    ::someType 是一种使用标准cast(something as sometype) 的postgres 方式。你可以尝试在你的框架中找到这个cast

    其他选项是使用date_trunc('day',date) = to_date('2015-08-22', 'YYYY-MM-DD')date_trunc('day',date) = '2015-08-22'

    【讨论】:

    • 如何在knex.js中实现这些功能?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多