将一个函数的使用输出序列化到另一个函数中(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_trunc
和 Interval
个碎片放在一个 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,
});
我必须将 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_trunc
和 Interval
个碎片放在一个 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,
});