better handling dates in clickhouse

This commit is contained in:
Carl-Gerhard Lindesvärd
2024-08-28 10:53:23 +02:00
parent df05e2dab3
commit 2be2ff3e12
14 changed files with 97 additions and 71 deletions

View File

@@ -1,5 +1,8 @@
import type { ResponseJSON } from '@clickhouse/client';
import { createClient } from '@clickhouse/client';
import { escape } from 'sqlstring';
import type { IInterval } from '@openpanel/validation';
export const TABLE_NAMES = {
events: 'events_v2',
@@ -126,6 +129,22 @@ export function formatClickhouseDate(
return date.toISOString().replace('T', ' ').replace(/Z+$/, '');
}
export function toDate(str: string, interval?: IInterval) {
if (!interval || interval === 'minute' || interval === 'hour') {
if (str.match(/\d{4}-\d{2}-\d{2}/)) {
return escape(str);
}
return str;
}
if (str.match(/\d{4}-\d{2}-\d{2}/)) {
return `toDate(${escape(str)})`;
}
return `toDate(${str})`;
}
export function convertClickhouseDateToJs(date: string) {
return new Date(date.replace(' ', 'T') + 'Z');
}

View File

@@ -6,7 +6,11 @@ import type {
IGetChartDataInput,
} from '@openpanel/validation';
import { formatClickhouseDate, TABLE_NAMES } from '../clickhouse-client';
import {
formatClickhouseDate,
TABLE_NAMES,
toDate,
} from '../clickhouse-client';
import { createSqlBuilder } from '../sql-builder';
function getPropertyKey(property: string) {
@@ -67,21 +71,11 @@ export function getChartSql({
sb.groupBy.date = 'date';
if (startDate) {
sb.where.startDate = `created_at >= '${formatClickhouseDate(startDate)}'`;
// if (interval === 'minute' || interval === 'hour') {
// sb.where.startDate = `created_at >= '${formatClickhouseDate(startDate)}'`;
// } else {
// sb.where.startDate = `toDate(created_at) >= '${formatClickhouseDate(startDate, true)}'`;
// }
sb.where.startDate = `${toDate('created_at', interval)} >= ${toDate(formatClickhouseDate(startDate), interval)}`;
}
if (endDate) {
sb.where.endDate = `created_at <= '${formatClickhouseDate(endDate)}'`;
// if (interval === 'minute' || interval === 'hour') {
// sb.where.endDate = `created_at <= '${formatClickhouseDate(endDate)}'`;
// } else {
// sb.where.endDate = `toDate(created_at) <= '${formatClickhouseDate(endDate, true)}'`;
// }
sb.where.endDate = `${toDate('created_at', interval)} <= ${toDate(formatClickhouseDate(endDate), interval)}`;
}
if (breakdowns.length > 0 && limit) {