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..d95430e26b 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,31 @@ const sqlite3 = { const unit = convertUnits(rawUnit, 'sqlite'); switch (unit) { case 'seconds': - sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 86400)`; + sql = `(strftime('%s', ${datetime_expr1}) - strftime('%s', ${datetime_expr2}))`; break; case 'minutes': - sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 1440)`; + sql = `(strftime('%s', ${datetime_expr1}) - strftime('%s', ${datetime_expr2})) / 60`; break; case 'hours': - sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 24)`; + sql = `(strftime('%s', ${datetime_expr1}) - strftime('%s', ${datetime_expr2})) / 3600`; break; case 'milliseconds': - sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 86400000)`; + sql = `(strftime('%s', ${datetime_expr1}) - strftime('%s', ${datetime_expr2})) * 1000`; 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 = `(strftime('%Y', ${datetime_expr1}) - strftime('%Y', ${datetime_expr2})) * 12 + (strftime('%m', ${datetime_expr1}) - strftime('%m', ${datetime_expr2})) `; 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 - `; + sql = `(strftime('%Y', ${datetime_expr1}) - strftime('%Y', ${datetime_expr2})) * 4 + (strftime('%m', ${datetime_expr1}) - strftime('%m', ${datetime_expr2})) / 3`; break; case 'years': - sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) / 365)`; + sql = `strftime('%Y', ${datetime_expr1}) - strftime('%Y', ${datetime_expr2})`; break; case 'days': - sql = `JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')`; + sql = `JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})`; break; default: sql = ''; diff --git a/tests/playwright/tests/columnFormula.spec.ts b/tests/playwright/tests/columnFormula.spec.ts index bc08da00ba..3f29a09c05 100644 --- a/tests/playwright/tests/columnFormula.spec.ts +++ b/tests/playwright/tests/columnFormula.spec.ts @@ -66,10 +66,22 @@ const formulaDataByDbType = (context: NcContext) => [ formula: `DATETIME_DIFF("2022/10/14", "2023/10/14", "y")`, result: ['-1', '-1', '-1', '-1', '-1'], }, + { + formula: `DATETIME_DIFF(NOW(), "2023/10/14", "y")`, + result: ['0', '0', '0', '0', '0'], + }, + { + formula: `DATETIME_DIFF("2023/10/14", NOW(), "y")`, + result: ['0', '0', '0', '0', '0'], + }, { formula: `DATETIME_DIFF("2022/10/14", "2023/10/14", "d")`, result: ['-365', '-365', '-365', '-365', '-365'], }, + { + formula: `DATETIME_DIFF("2022/10/14", NOW(), "d")`, + result: ['-90', '-90', '-90', '-90', '-90'], + }, { formula: `CONCAT(UPPER({City}), LOWER({City}), TRIM(' trimmed '))`, result: [