metabase-clickhouse-driver icon indicating copy to clipboard operation
metabase-clickhouse-driver copied to clipboard

"Week" aggregation is inconsistent with setting "Start of the week" is set to "Monday"

Open ppavlov39 opened this issue 2 years ago • 4 comments

Describe the bug Hi! When setting "Start-of-the-week" is set to "Monday" and when we use a query builder then a weekly aggregation query gets wrong result - the first day of the aggregation is the Sunday of previous week.

To Reproduce Steps to reproduce the behavior:

  1. Select "Monday" as "Start of the week" in Admin settings.
  2. Aggregate data on "Week"
  3. Find data belonging to previous week with Sunday as first day of week.

Expected behavior The first day of week is Monday.

Example

  1. Prepare a query in the query builder with filter on date field image
  2. Get results from previous week with wrong first day (02.01.22, 09.01.22 and 16.01.22 are Sundays) image

Here is the query that MB generates:

SELECT (toMonday((toDate(`DB`.`TABLE`.`COLUMN`) + 1)) - 1) AS `COLUMN`, count(*) AS `count`
FROM `DB`.`TABLE`
WHERE (`DB`.`TABLE`.`COLUMN` >= parseDateTimeBestEffort('2022-01-03 00:00:00.000+03:00')
   AND `DB`.`TABLE`.`COLUMN` < parseDateTimeBestEffort('2022-01-17 00:00:00.000+03:00'))
GROUP BY (toMonday((toDate(`DB`.`TABLE`.`COLUMN`) + 1)) - 1)
ORDER BY (toMonday((toDate(`DB`.`TABLE`.`COLUMN`) + 1)) - 1) ASC

Executing the query without MB gives the same result.

Setup

  • Metabase 0.42.4
  • Metabase-clickhouse-driver 0.8.1

And the same behavior on

  • Metabase 0.45.2
  • Metabase-clickhouse-driver 0.9.2

ppavlov39 avatar Jan 26 '23 14:01 ppavlov39

@ppavlov39, recently, we investigated a time zones issue #122, and the conclusion was that the discrepancy between MB/JVM/system timezones could cause all kinds of problems like that. Could you check if it works in this case too?

slvrtrn avatar Mar 29 '23 19:03 slvrtrn

Hello! Having a similar issue here (and it also happens on Dbeaver). My columns have America/Mexico_City timezone but when trying to build some metrics with Metabase, it tries to cast as date time and then I end with +6 hours difference. This is a sample of the code that MB runs:

SELECT
    transaction_id,
  transaction_added,
  toStartOfHour(
    CAST(
      `warehouse_prd`.`transactions`.`transaction_added` AS datetime
    )
  ) AS `transaction_added_cast`
FROM
  `warehouse_prd`.`transactions`
 WHERE
    transaction_added > '2023-09-21'

I pointed out this issue a couple of months ago, and I believe Alexei suggested a feature enhancement request. Was it created? I would like to track it. We are about to open the new db to the entire company. Thanks in advance!

brendavarguez avatar Sep 27 '23 21:09 brendavarguez

@brendavarguez, I see that the feature request is now created: https://github.com/ClickHouse/ClickHouse/issues/55072

Until it is resolved, when using CAST, the best bet currently is to set the matching timezone of JVM on your machine like it is described here.

slvrtrn avatar Sep 28 '23 00:09 slvrtrn

@brendavarguez, another possible workaround, perhaps a better one than setting a JVM timezone if you have multiple timezones in your DateTime64 columns, is to create timezone-related questions using the SQL editor.

Consider this dataset: https://fiddle.clickhouse.com/c778ba77-508b-49dc-8568-3264470dc0c7

CREATE TABLE wares (
  id UInt64,
  name String,
  createdAt DateTime('America/Mexico_City')
) ENGINE MergeTree ORDER BY id;

INSERT INTO wares VALUES
(1, 'foo', toDateTime('2023-01-01 04:00:00', 'America/Mexico_City')), (2, 'bar', toDateTime('2023-01-01 04:01:00', 'America/Mexico_City'));

image

^ which yields correct results, as we enforce the timezone in parseDateTime64BestEffort call.

EDIT: simpler examples

slvrtrn avatar Sep 28 '23 00:09 slvrtrn

Closing this due to inactivity; if this issue persists even after 1.50.1, please feel free to re-open/create a new one.

slvrtrn avatar Jun 27 '24 20:06 slvrtrn