将一个函数的使用输出序列化到另一个函数中(date_trunc 到文字中)

Sequelize use output of one function into another (date_trunc into literal)

我必须将 postgres 查询转换为 Sequelize 查询。

以下查询正在获取每周摘要。但是开始的日子是星期一。

SELECT date_trunc('week', date::date) AS "weekly", COUNT(DISTINCT(date)) AS "working_days" FROM "public"."employees" AS "Employee" WHERE ("Employee"."deleted_at" IS NULL) GROUP BY "weekly" LIMIT 100;

代码:

const dateTruncFunc = fn("date_trunc", "week", literal("date::date"));

const result = await Employee.findAll({
    limit: 100,
    attributes: [
        [dateTruncFunc, "weekly"],
        [literal("COUNT(DISTINCT(date))"), "working_days"],
    ],
    group: ["weekly"],
    raw: true,
});
console.log(result);

输出:

[
  { weekly: 2021-11-15T00:00:00.000Z, working_days: '1' },
  { weekly: 2021-11-22T00:00:00.000Z, working_days: '1' },
  { weekly: 2021-12-13T00:00:00.000Z, working_days: '2' },
  { weekly: 2021-12-20T00:00:00.000Z, working_days: '4' },
  { weekly: 2021-12-27T00:00:00.000Z, working_days: '2' },
  { weekly: 2022-01-03T00:00:00.000Z, working_days: '3' },
  { weekly: 2022-01-10T00:00:00.000Z, working_days: '6' },
  { weekly: 2022-01-17T00:00:00.000Z, working_days: '7' },
  { weekly: 2022-01-24T00:00:00.000Z, working_days: '7' },
  { weekly: 2022-01-31T00:00:00.000Z, working_days: '1' }
]

我想查询从星期四开始的一天

SELECT date_trunc('week', date::date) - Interval '4 days' AS "weekly", COUNT(DISTINCT(date)) AS "working_days" FROM "public"."employees" AS "Employee" WHERE ("Employee"."deleted_at" IS NULL) GROUP BY "weekly" LIMIT 100;

代码:

const dateTruncFunc = fn("date_trunc", "week", literal("date::date"));
const intervalLiteral = literal(" - Interval '4 days'");

const result = await Employee.findAll({
    attributes: [
        [fn("concat", dateTruncFunc, intervalLiteral), "weekly"],
        [literal("COUNT(DISTINCT(date))"), "working_days"],
    ],
    group: ["weekly"],
    raw: true,
});
console.log(result);

生成的查询:

SELECT concat(date_trunc('week', date::date), - Interval '4 days') AS "weekly", COUNT(DISTINCT(date)) AS "working_days" FROM "public"."employees" AS "Employee" WHERE ("Employee"."deleted_at" IS NULL) GROUP BY "weekly" LIMIT 100;

输出:

[
  { weekly: '2021-11-15 00:00:00+00-4 days', working_days: '1' },
  { weekly: '2021-11-22 00:00:00+00-4 days', working_days: '1' },
  { weekly: '2021-12-13 00:00:00+00-4 days', working_days: '2' },
  { weekly: '2021-12-20 00:00:00+00-4 days', working_days: '4' },
  { weekly: '2021-12-27 00:00:00+00-4 days', working_days: '2' },
  { weekly: '2022-01-03 00:00:00+00-4 days', working_days: '3' },
  { weekly: '2022-01-10 00:00:00+00-4 days', working_days: '6' },
  { weekly: '2022-01-17 00:00:00+00-4 days', working_days: '7' },
  { weekly: '2022-01-24 00:00:00+00-4 days', working_days: '7' },
  { weekly: '2022-01-31 00:00:00+00-4 days', working_days: '1' }
]

输出错误,因为我正在将 date_trunc 输出连接到 literal,这是错误的。

搜索了所有资源以找到相同的问题,但无法找到它。

我需要将两个函数的字符串表示合并在一起并执行它。

请帮忙!

您需要将 date_truncInterval 个碎片放在一个 Literal:

const truncWithIntervalLiteral = literal("date_trunc('week', date::date),  - Interval '4 days'");

const result = await Employee.findAll({
    attributes: [
        [truncWithIntervalLiteral , "weekly"],
        [literal("COUNT(DISTINCT(date))"), "working_days"],
    ],
    group: ["weekly"],
    raw: true,
});