|
|
|
@ -1,7 +1,12 @@
|
|
|
|
|
import dayjs from 'dayjs'; |
|
|
|
|
import { MapFnArgs } from '../mapFunctionName'; |
|
|
|
|
import commonFns from './commonFns'; |
|
|
|
|
import { convertUnits } from '../helpers/convertUnits'; |
|
|
|
|
import { getWeekdayByText } from '../helpers/formulaFnHelper'; |
|
|
|
|
import { |
|
|
|
|
convertToTargetFormat, |
|
|
|
|
getDateFormat, |
|
|
|
|
} from '../../../../../utils/dateTimeUtils'; |
|
|
|
|
|
|
|
|
|
const sqlite3 = { |
|
|
|
|
...commonFns, |
|
|
|
@ -77,7 +82,63 @@ const sqlite3 = {
|
|
|
|
|
END${colAlias}` |
|
|
|
|
); |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
DATETIME_DIFF: ({ fn, knex, pt, colAlias }: MapFnArgs) => { |
|
|
|
|
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' |
|
|
|
|
); |
|
|
|
|
const rawUnit = pt.arguments[2] |
|
|
|
|
? fn(pt.arguments[2]).bindings[0] |
|
|
|
|
: 'seconds'; |
|
|
|
|
let sql; |
|
|
|
|
const unit = convertUnits(rawUnit, 'sqlite'); |
|
|
|
|
switch (unit) { |
|
|
|
|
case 'seconds': |
|
|
|
|
sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 86400)`; |
|
|
|
|
break; |
|
|
|
|
case 'minutes': |
|
|
|
|
sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 1440)`; |
|
|
|
|
break; |
|
|
|
|
case 'hours': |
|
|
|
|
sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 24)`; |
|
|
|
|
break; |
|
|
|
|
case 'milliseconds': |
|
|
|
|
sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) * 86400000)`; |
|
|
|
|
break; |
|
|
|
|
case 'weeks': |
|
|
|
|
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))`;
|
|
|
|
|
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 |
|
|
|
|
`;
|
|
|
|
|
break; |
|
|
|
|
case 'years': |
|
|
|
|
sql = `ROUND((JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')) / 365)`; |
|
|
|
|
break; |
|
|
|
|
case 'days': |
|
|
|
|
sql = `JULIANDAY('${datetime_expr1}') - JULIANDAY('${datetime_expr2}')`; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
sql = ''; |
|
|
|
|
} |
|
|
|
|
return knex.raw(`${sql} ${colAlias}`); |
|
|
|
|
}, |
|
|
|
|
WEEKDAY: ({ fn, knex, pt, colAlias }: MapFnArgs) => { |
|
|
|
|
// strftime('%w', date) - day of week 0 - 6 with Sunday == 0
|
|
|
|
|
// WEEKDAY() returns an index from 0 to 6 for Monday to Sunday
|
|
|
|
|