From 061d27e4ba125caf07b52d4aa69c11ed63712b84 Mon Sep 17 00:00:00 2001 From: Wing-Kam Wong Date: Thu, 12 Jan 2023 12:34:09 +0800 Subject: [PATCH] fix(nocodb): revise DATETIME_DIFF logic for sqlite --- .../lib/sql/functionMappings/sqlite.ts | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/sqlite.ts b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/sqlite.ts index 9c5f500431..81abddfc2c 100644 --- a/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/sqlite.ts +++ b/packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/sqlite.ts @@ -83,19 +83,25 @@ const sqlite3 = { ); }, DATETIME_DIFF: ({ fn, knex, pt, colAlias }: MapFnArgs) => { - let datetime_expr1 = fn(pt.arguments[0]).bindings[0]; - let datetime_expr2 = fn(pt.arguments[1]).bindings[0]; + let datetime_expr1 = fn(pt.arguments[0]); + let datetime_expr2 = fn(pt.arguments[1]); // JULIANDAY takes YYYY-MM-DD - datetime_expr1 = convertToTargetFormat( - datetime_expr1, - getDateFormat(datetime_expr1), - 'YYYY-MM-DD' - ); - datetime_expr2 = convertToTargetFormat( - datetime_expr2, - getDateFormat(datetime_expr2), - 'YYYY-MM-DD' - ); + if (datetime_expr1.sql === '?' && datetime_expr1.bindings?.[0]) { + datetime_expr1 = `'${convertToTargetFormat( + datetime_expr1.bindings[0], + getDateFormat(datetime_expr1.bindings[0]), + 'YYYY-MM-DD' + )}'`; + } + + if (datetime_expr2.sql === '?' && datetime_expr2.bindings?.[0]) { + datetime_expr2 = `'${convertToTargetFormat( + datetime_expr2.bindings[0], + getDateFormat(datetime_expr2.bindings[0]), + 'YYYY-MM-DD' + )}'`; + } + const rawUnit = pt.arguments[2] ? fn(pt.arguments[2]).bindings[0] : 'seconds'; @@ -103,36 +109,36 @@ const sqlite3 = { const unit = convertUnits(rawUnit, 'sqlite'); switch (unit) { case 'seconds': - sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 86400)`; + sql = `ROUND((JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})) * 86400)`; break; case 'minutes': - sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 1440)`; + sql = `ROUND((JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})) * 1440)`; break; case 'hours': - sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 24)`; + sql = `ROUND((JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})) * 24)`; break; case 'milliseconds': - sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 86400000)`; + sql = `ROUND((JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})) * 86400000)`; break; case 'weeks': - sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) / 7)`; + sql = `ROUND((JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})) / 7)`; break; case 'months': - sql = `(ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) / 365)) - * 12 + (ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) / 365 / 12))`; + sql = `(ROUND((JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})) / 365)) + * 12 + (ROUND((JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})) / 365 / 12))`; break; case 'quarters': sql = ` - ROUND((JULIANDAY('${datetime_expr1}')) / 365 / 4) - - ROUND((JULIANDAY('${datetime_expr2}')) / 365 / 4) + - (ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) / 365)) * 4 + ROUND((JULIANDAY(${datetime_expr1})) / 365 / 4) - + ROUND((JULIANDAY(${datetime_expr2})) / 365 / 4) + + (ROUND((JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})) / 365)) * 4 `; break; case 'years': - sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) / 365)`; + sql = `ROUND((JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})) / 365)`; break; case 'days': - sql = `JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')`; + sql = `JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})`; break; default: sql = '';