add better support for timezones
This commit is contained in:
@@ -15,6 +15,7 @@ export const ch = createClient({
|
||||
export async function chQueryWithMeta<T extends Record<string, any>>(
|
||||
query: string
|
||||
): Promise<ResponseJSON<T>> {
|
||||
console.log('Query:', query);
|
||||
const start = Date.now();
|
||||
const res = await ch.query({
|
||||
query,
|
||||
@@ -39,7 +40,6 @@ export async function chQueryWithMeta<T extends Record<string, any>>(
|
||||
|
||||
console.log(`Clickhouse query took ${response.statistics?.elapsed}ms`);
|
||||
console.log(`chQuery took ${Date.now() - start}ms`);
|
||||
console.log('Query:', query);
|
||||
|
||||
return response;
|
||||
}
|
||||
@@ -52,7 +52,11 @@ export async function chQuery<T extends Record<string, any>>(
|
||||
|
||||
export function formatClickhouseDate(_date: Date | string) {
|
||||
const date = typeof _date === 'string' ? new Date(_date) : _date;
|
||||
return date.toISOString().replace('T', ' ').replace(/Z+$/, '');
|
||||
return date
|
||||
.toISOString()
|
||||
.replace('T', ' ')
|
||||
.replace(/Z+$/, '')
|
||||
.replace(/\.[0-9]+$/, '');
|
||||
}
|
||||
|
||||
export function convertClickhouseDateToJs(date: string) {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { escape } from 'sqlstring';
|
||||
|
||||
import { getTimezoneFromDateString } from '@openpanel/common';
|
||||
import type {
|
||||
IChartEventFilter,
|
||||
IGetChartDataInput,
|
||||
@@ -21,32 +22,40 @@ export function getChartSql({
|
||||
|
||||
sb.where = getEventFiltersWhereClause(event.filters);
|
||||
sb.where.projectId = `project_id = ${escape(projectId)}`;
|
||||
|
||||
let labelValue = escape('*');
|
||||
if (event.name !== '*') {
|
||||
sb.select.label = `${escape(event.name)} as label`;
|
||||
sb.where.eventName = `name = ${escape(event.name)}`;
|
||||
labelValue = `${escape(event.name)}`;
|
||||
sb.select.label = `${labelValue} as label`;
|
||||
sb.where.eventName = `name = ${labelValue}`;
|
||||
} else {
|
||||
sb.select.label = `${labelValue} as label`;
|
||||
}
|
||||
|
||||
sb.select.count = `count(*) as count`;
|
||||
switch (interval) {
|
||||
case 'minute': {
|
||||
sb.select.date = `toStartOfMinute(created_at) as date`;
|
||||
sb.select.date = `toStartOfMinute(toTimeZone(created_at, '${getTimezoneFromDateString(startDate)}')) as date`;
|
||||
sb.orderBy.date = `date ASC WITH FILL FROM toStartOfMinute(toTimeZone(toDateTime('${formatClickhouseDate(startDate)}'), '${getTimezoneFromDateString(startDate)}')) TO toStartOfMinute(toTimeZone(toDateTime('${formatClickhouseDate(endDate)}'), '${getTimezoneFromDateString(startDate)}')) STEP toIntervalMinute(1) INTERPOLATE ( label as ${labelValue} )`;
|
||||
break;
|
||||
}
|
||||
case 'hour': {
|
||||
sb.select.date = `toStartOfHour(created_at) as date`;
|
||||
sb.select.date = `toStartOfHour(toTimeZone(created_at, '${getTimezoneFromDateString(startDate)}')) as date`;
|
||||
sb.orderBy.date = `date ASC WITH FILL FROM toStartOfHour(toTimeZone(toDateTime('${formatClickhouseDate(startDate)}'), '${getTimezoneFromDateString(startDate)}')) TO toStartOfHour(toTimeZone(toDateTime('${formatClickhouseDate(endDate)}'), '${getTimezoneFromDateString(startDate)}')) STEP toIntervalHour(1) INTERPOLATE ( label as ${labelValue} )`;
|
||||
break;
|
||||
}
|
||||
case 'day': {
|
||||
sb.select.date = `toStartOfDay(created_at) as date`;
|
||||
sb.select.date = `toStartOfDay(toTimeZone(created_at, '${getTimezoneFromDateString(startDate)}')) as date`;
|
||||
sb.orderBy.date = `date ASC WITH FILL FROM toStartOfDay(toTimeZone(toDateTime('${formatClickhouseDate(startDate)}'), '${getTimezoneFromDateString(startDate)}')) TO toStartOfDay(toTimeZone(toDateTime('${formatClickhouseDate(endDate)}'), '${getTimezoneFromDateString(startDate)}')) STEP toIntervalDay(1) INTERPOLATE ( label as ${labelValue} )`;
|
||||
break;
|
||||
}
|
||||
case 'month': {
|
||||
sb.select.date = `toStartOfMonth(created_at) as date`;
|
||||
sb.select.date = `toStartOfMonth(toTimeZone(created_at, '${getTimezoneFromDateString(startDate)}')) as date`;
|
||||
sb.orderBy.date = `date ASC WITH FILL FROM toStartOfMonth(toTimeZone(toDateTime('${formatClickhouseDate(startDate)}'), '${getTimezoneFromDateString(startDate)}')) TO toStartOfMonth(toTimeZone(toDateTime('${formatClickhouseDate(endDate)}'), '${getTimezoneFromDateString(startDate)}')) STEP toIntervalMonth(1) INTERPOLATE ( label as ${labelValue} )`;
|
||||
break;
|
||||
}
|
||||
}
|
||||
sb.groupBy.date = 'date';
|
||||
sb.orderBy.date = 'date ASC';
|
||||
|
||||
if (startDate) {
|
||||
sb.where.startDate = `created_at >= '${formatClickhouseDate(startDate)}'`;
|
||||
|
||||
Reference in New Issue
Block a user