diff --git a/lib/prisma.ts b/lib/prisma.ts index 76c5a09b1d..5a21a6ec60 100644 --- a/lib/prisma.ts +++ b/lib/prisma.ts @@ -35,6 +35,30 @@ function getAddMinutesQuery(field: string, minutes: number): string { } } +function getDayDiffQuery(field1: string, field2: string): string { + const db = getDatabaseType(process.env.DATABASE_URL); + + if (db === POSTGRESQL) { + return `${field1}::date - ${field2}::date`; + } + + if (db === MYSQL) { + return `DATEDIFF(${field1}, ${field2})`; + } +} + +function getCastColumnQuery(field: string, type: string): string { + const db = getDatabaseType(process.env.DATABASE_URL); + + if (db === POSTGRESQL) { + return `${field}::${type}`; + } + + if (db === MYSQL) { + return `${field}`; + } +} + function getDateQuery(field: string, unit: string, timezone?: string): string { const db = getDatabaseType(); @@ -193,6 +217,8 @@ function getSearchMode(): { mode?: Prisma.QueryMode } { export default { ...prisma, getAddMinutesQuery, + getDayDiffQuery, + getCastColumnQuery, getDateQuery, getTimestampIntervalQuery, getFilterQuery, diff --git a/queries/analytics/reports/getRetention.ts b/queries/analytics/reports/getRetention.ts index ee7e4619b7..3abc0e7ae5 100644 --- a/queries/analytics/reports/getRetention.ts +++ b/queries/analytics/reports/getRetention.ts @@ -33,7 +33,7 @@ async function relationalQuery( }[] > { const { startDate, endDate } = dateRange; - const { getDateQuery, rawQuery } = prisma; + const { getDateQuery, getDayDiffQuery, getCastColumnQuery, rawQuery } = prisma; const timezone = 'utc'; const unit = 'day'; @@ -49,7 +49,10 @@ async function relationalQuery( user_activities AS ( select distinct w.session_id, - (${getDateQuery('created_at', unit, timezone)}::date - c.cohort_date::date) as day_number + ${getDayDiffQuery( + getDateQuery('created_at', unit, timezone), + 'c.cohort_date', + )} as day_number from website_event w join cohort_items c on w.session_id = c.session_id @@ -78,7 +81,7 @@ async function relationalQuery( c.day_number as day, s.visitors, c.visitors as "returnVisitors", - c.visitors::float * 100 / s.visitors as percentage + ${getCastColumnQuery('c.visitors', 'float')} * 100 / s.visitors as percentage from cohort_date c join cohort_size s on c.cohort_date = s.cohort_date @@ -89,7 +92,9 @@ async function relationalQuery( startDate, endDate, }, - ); + ).then(results => { + return results.map(i => ({ ...i, percentage: Number(i.percentage) || 0 })); + }); } async function clickhouseQuery(