Browse Source

Merge pull request #4809 from nocodb/fix/formula-datetime-diff-sqlite

fix(nocodb): formula datetime diff for sqlite
pull/4810/head
navi 2 years ago committed by GitHub
parent
commit
a72737956e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 53
      packages/nocodb/src/lib/db/sql-data-mapper/lib/sql/functionMappings/sqlite.ts
  2. 12
      tests/playwright/tests/columnFormula.spec.ts

53
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) => { DATETIME_DIFF: ({ fn, knex, pt, colAlias }: MapFnArgs) => {
let datetime_expr1 = fn(pt.arguments[0]).bindings[0]; let datetime_expr1 = fn(pt.arguments[0]);
let datetime_expr2 = fn(pt.arguments[1]).bindings[0]; let datetime_expr2 = fn(pt.arguments[1]);
// JULIANDAY takes YYYY-MM-DD // JULIANDAY takes YYYY-MM-DD
datetime_expr1 = convertToTargetFormat( if (datetime_expr1.sql === '?' && datetime_expr1.bindings?.[0]) {
datetime_expr1, datetime_expr1 = `'${convertToTargetFormat(
getDateFormat(datetime_expr1), datetime_expr1.bindings[0],
'YYYY-MM-DD' getDateFormat(datetime_expr1.bindings[0]),
); 'YYYY-MM-DD'
datetime_expr2 = convertToTargetFormat( )}'`;
datetime_expr2, }
getDateFormat(datetime_expr2),
'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] const rawUnit = pt.arguments[2]
? fn(pt.arguments[2]).bindings[0] ? fn(pt.arguments[2]).bindings[0]
: 'seconds'; : 'seconds';
@ -103,36 +109,31 @@ const sqlite3 = {
const unit = convertUnits(rawUnit, 'sqlite'); const unit = convertUnits(rawUnit, 'sqlite');
switch (unit) { switch (unit) {
case 'seconds': case 'seconds':
sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 86400)`; sql = `(strftime('%s', ${datetime_expr1}) - strftime('%s', ${datetime_expr2}))`;
break; break;
case 'minutes': case 'minutes':
sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 1440)`; sql = `(strftime('%s', ${datetime_expr1}) - strftime('%s', ${datetime_expr2})) / 60`;
break; break;
case 'hours': case 'hours':
sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 24)`; sql = `(strftime('%s', ${datetime_expr1}) - strftime('%s', ${datetime_expr2})) / 3600`;
break; break;
case 'milliseconds': case 'milliseconds':
sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 86400000)`; sql = `(strftime('%s', ${datetime_expr1}) - strftime('%s', ${datetime_expr2})) * 1000`;
break; break;
case 'weeks': case 'weeks':
sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) / 7)`; sql = `ROUND((JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})) / 7)`;
break; break;
case 'months': case 'months':
sql = `(ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) / 365)) sql = `(strftime('%Y', ${datetime_expr1}) - strftime('%Y', ${datetime_expr2})) * 12 + (strftime('%m', ${datetime_expr1}) - strftime('%m', ${datetime_expr2})) `;
* 12 + (ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) / 365 / 12))`;
break; break;
case 'quarters': case 'quarters':
sql = ` sql = `(strftime('%Y', ${datetime_expr1}) - strftime('%Y', ${datetime_expr2})) * 4 + (strftime('%m', ${datetime_expr1}) - strftime('%m', ${datetime_expr2})) / 3`;
ROUND((JULIANDAY('${datetime_expr1}')) / 365 / 4) -
ROUND((JULIANDAY('${datetime_expr2}')) / 365 / 4) +
(ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) / 365)) * 4
`;
break; break;
case 'years': case 'years':
sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) / 365)`; sql = `strftime('%Y', ${datetime_expr1}) - strftime('%Y', ${datetime_expr2})`;
break; break;
case 'days': case 'days':
sql = `JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')`; sql = `JULIANDAY(${datetime_expr1}) - JULIANDAY(${datetime_expr2})`;
break; break;
default: default:
sql = ''; sql = '';

12
tests/playwright/tests/columnFormula.spec.ts

@ -66,10 +66,22 @@ const formulaDataByDbType = (context: NcContext) => [
formula: `DATETIME_DIFF("2022/10/14", "2023/10/14", "y")`, formula: `DATETIME_DIFF("2022/10/14", "2023/10/14", "y")`,
result: ['-1', '-1', '-1', '-1', '-1'], 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")`, formula: `DATETIME_DIFF("2022/10/14", "2023/10/14", "d")`,
result: ['-365', '-365', '-365', '-365', '-365'], 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 '))`, formula: `CONCAT(UPPER({City}), LOWER({City}), TRIM(' trimmed '))`,
result: [ result: [

Loading…
Cancel
Save