diff --git a/src/schema/pg-catalog/binary-operators.ts b/src/schema/pg-catalog/binary-operators.ts index d88764e..83055fc 100644 --- a/src/schema/pg-catalog/binary-operators.ts +++ b/src/schema/pg-catalog/binary-operators.ts @@ -68,6 +68,16 @@ function registerNumericOperators(schema: _ISchema) { function registerDatetimeOperators(schema: _ISchema) { + // ======= date "-" date ======= + schema.registerOperator({ + operator: '-', + commutative: false, + left: Types.date, + right: Types.date, + returns: Types.interval, + implementation: (a, b) => moment(a).diff(moment(b), 'days'), + }) + // ======= date/time "+ -" timestamp ======= for (const dt of dateTypes) { for (const [operator, f] of [['+', 1], ['-', -1]] as const) { diff --git a/src/tests/operators.queries.spec.ts b/src/tests/operators.queries.spec.ts index befcd5b..ad556b9 100644 --- a/src/tests/operators.queries.spec.ts +++ b/src/tests/operators.queries.spec.ts @@ -56,6 +56,14 @@ describe('Operators', () => { expect(dt.toString()).to.equal(moment.utc().startOf('day').add(1, 'day').toDate().toString()); }); + it('date - date', () => { + const result = many(`select '2020-01-02'::date - '2020-01-01'::date as dt`); + expect(result[0]?.dt).to.equal(1); + const result2 = many(`select '2020-01-03'::date - '2020-01-01'::date as dt`); + expect(result2[0]?.dt).to.equal(2); + const result3 = many(`select '2022-01-03'::date - '2020-01-01'::date as dt`); + expect(result3[0]?.dt).to.equal(731); + }); it('timestamp + interval', () => { const result = many(`select now() + interval '1 day' as dt`);